c++從入門到精通,引用相關介紹
阿新 • • 發佈:2022-02-05
引用的實質及應用
很多剛入門c++的計算機小白,在面露難色學完指標後再接觸C++中的引用。就會有一種十分舒適的感覺。在c++中引用無論如何都是在某些方面替代指標的容易上手的工具。引用通俗一點就是別名,而指標是涉及計算機底層記憶體的地址。當然既然是工具我們就得深入瞭解引用。引用的實質還是指標常量,只不過更加“平易近人”
引用的實質
首先讓我們複習以下***指標常量***
指標常量特點:指標的指向不可以修改,但是指標指向的值可以修改,後面兩字可修改
#include<iostream>
using namespace std;
int main() {
int a = 10;
int b = 10;
int* p = &a;//定義一個指標p指向a的地址。
//指標常量特點:指標的指向不可以修改,但是指標指向的值可以修改,
int* const p2 = &a;//定義一個指標常量p2指向a的地址。
//p2 = &b //錯誤,因為指標指向不可修改
*p2 = 20; //正確,指標指向的值可以修改。
system("pause");
return 0;
}
這裡就不畫記憶體條詳細解釋了。>_<
引用的注意事項
根據指標常量的特點:
-
引用必須初始化
-
引用一旦初始化以後便不可修改
a = 10;
b = 20;
int &c = a; //這就是將引用c初始化。
//int &c 錯誤
c = b
/*!!!!這並不是更改引用,而是賦值操作。
即a及a的別名c均重新變成了20*/
結合指標常量這也是非常好理解的。(也許你並不想提這幾個字)@- _ @-。
引用的相關用法
- 引用作函式引數
可以實現指標傳遞的功能並代替指標。我們知道引用的實質,但在我們用的時候。我們只需要考慮這就是個別名
#include<iostream>
using namespace std;
//值傳遞。只可改變形式引數,不可改變實參。
void hanshu_1(int a, int b){
int temp = a;
a = b;
b = temp;
}
//地址傳遞。可改變實參。
void hanshu_2(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}
//引用傳遞。也可改變實參,更加通俗易懂。
void hanshu_3(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
//值傳遞
hanshu_1(a,b);
cout<<"a與b的值是"<<a<<";"<<b<<endl;//不會交換
//地址傳遞
hanshu_2(&a,&b);
cout<<"a與b的值是"<<a<<";"<<b<<endl;//會交換
//引用傳遞
hanshu_3(a,b);
cout<<"a與b的值是"<<a<<";"<<b<<endl;//會交換
}
引用作函式返回值
- 不要返回區域性變數的引用。
#include<iostream>
using namespace std;
int& hanshu(){
int a = 10;
return a
}
int main(){
int &test = hanshu();
cout << test << endl;//第一次返回系統會預設幫你儲存區域性變數a的值
cout << test << endl;//棧區中的a已被釋放,不會返回 10
}
上面的函式有問題。具體可自己嘗試。
棧區的基部概念:
棧區資料由編譯器管理開闢與釋放:
注意!不要在函式中返回區域性變數的地址。因為區域性變數存放在棧區,資料在函式執行完後會自動釋放。
- 函式的呼叫可作為左值
#include<iostream>
using namespace std;
int& hanshu(){
static int a = 10;//靜態變數存放在堆區。
return a
}
int main(){
int &test = hanshu();
hanshu() = 1000;//左值即在等號的左邊
/*此時a與test均變為1000
因為返回的是引用,就相當於a賦值為1000!
*/
}
常量引用
- 加上const修飾形成防止誤操作使實參改變。
!!!以防萬一,將來如果出錯,在上萬行程式碼中找bug很恐怖@-_@-
void hanshu_1(const int& a){
cout<<a<<endl;
}
- 可實現優化程式碼
因為引用本身需要一個合法的記憶體空間。結合指標不可以對一個沒有指向的指標所指向的量進行賦值。
int &a = 10;//錯誤,因為引用本身需要一個合法的記憶體空間。
但是下面的可行。更簡潔因為編譯器幫我們作了相應的處理使其合法。
即幫我們建立了一個臨時變數來儲存10,再引用。
const int &a = 10;
關於引用就總結這麼多了,謝謝大家閱讀。
推薦自學C++的課程,嗶哩嗶哩up黑馬程式設計師,個人感覺課程十分nice
點選這裡
本文來自部落格園,作者:litecdows,作者在其他部落格平臺均使用此暱稱!
轉載請註明原文連結:https://www.cnblogs.com/litecdows/p/15864400.html