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;
*/
這時的引用是因為內存在程序結束之前不會被釋放掉;