C++引用的學習: 通常引用第一個作用,人們會想到的是引用的變數的別名;(可以說是直接操作這個變數); 引用的聲明: Type + & + name(可以認為是一個常指針) 註意:(1)&是起標識符的作用; (2)聲明引用時,必須先將其進行初始化; (3)不能建立數組的引用,因為數組是因為由若幹個元 ...
C++引用的學習:
通常引用第一個作用,人們會想到的是引用的變數的別名;(可以說是直接操作這個變數);
引用的聲明:
Type + & + name(可以認為是一個常指針)
註意:(1)&是起標識符的作用;
(2)聲明引用時,必須先將其進行初始化;
(3)不能建立數組的引用,因為數組是因為由若幹個元素組成,所以無法建立一個數組的別名;
引用的應用:
(引用作為參數)
int swap(int &a, int &b) { int t = a; a = b; b = t; }
(引用作為常數)
int main() { int b = 100; const int &a = b; return 0; }
這可以讓代碼的健壯性比較強,並且也有其他方面的需求;
(引用作為返回值)
Type + & + 函數名
(1)以引用返回函數值,定義函數時需要在函數名前加&;
(2)用引用返回一個函數值的最大好處是,在記憶體中不產生被返回值的副本。
但函數返回棧變數時,不能成為其他引用的初始值;(因為棧變數會因為函數結束後被釋放掉)
int &fun() { return a; //這樣當局部變數被釋放掉的時候,對局部變數的引用會指向一片不知哪裡的記憶體空間 } int main() { int &a = fun(); }
//這是錯誤的
並且不能成為左值;
函數返回靜態變數或全局變數:(這兩種變數都放在全局區)
可以作為其他值的引用,並且可以作為左值和右值;
以以上幾種情況寫一個代碼:
//返回靜態變數 int &fun1() { static int a = 1; return a; } //返回局部變數 int &fun2() { int a = 2; return a; } //參數是引用的 int &fun3(int &a) { return a; } int main() { int a = fun1(); int &b = fun1(); cout << "a = " << a << endl; cout << "b = " << b << endl; }
/*運行結果為:
a = 1;
b = 1;
*/
這是因為參數是全局的;
main() { int a = fun2(); int &b = fun2(); } /* 運行結果為2和-2 (負數代表指向記憶體不明確) */
因為這是的引用是局部變數當第2個分號結束時就會指向不明確的記憶體區;
main() {
int c = 10; int a = fun3(c); int &b = fun3(c); } /* 運行結果為 a = 10; b = 10; */
這時的引用是因為記憶體在程式結束之前不會被釋放掉;