【C++】引用那些事(1)
阿新 • • 發佈:2019-01-07
一、什麼是引用?
引用不是新定義一個變數,而是給已存在變數取了一個別名,編譯器不會為引用變數開闢記憶體空間,它和它
引用的變數共用同一塊記憶體空間。
比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風"。
型別& 引用變數名(物件名) = 引用實體;
void TestRef()
{
int a = 10;
int& ra = a;//<====定義引用型別
printf("%p\n", &a);
printf("%p\n", &ra);
}
在這裡,a和ra其實指向同一空間,它們的地址是一樣的,所以,ra相當於a的別名。
注意:引用型別必須和引用實體是同種型別的
二、特點:
1. 引用在定義時必須初始化!!!
void TestRef()
{
int a = 10;
// int& ra; // 該條語句編譯時會出錯
int& ra = a;
int& rra = a;
printf("%p %p %p\n", &a, &ra, &rra);
}
2. 一個變數可以有多個引用
void TestRef() { int a = 10; int& ra = a;//<====定義引用型別 int& rra=ra; int& rrra=rra; printf("%p\n", &a); printf("%p\n", &ra); }
3. 引用一旦引用一個實體,再不能引用其他實體
void TestRef()
{
int a = 10;
int& ra = a;//<====定義引用型別
int b = 100;
ra = b;//這句程式碼是指把b賦值給ra,引用是從一而終的,一旦引用就定了,不能在引用別的變數
printf("%p\n", &a);
printf("%p\n", &ra);
}
三、常引用
下圖程式碼裡,a,b都是 const 型別的,所以必須用 const 的引用 。在引用時,許可權可以縮小,不可以放大。
void TestConstRef() { const int a = 10; //int& ra = a; // 該語句編譯時會出錯,a為常量,具有常屬性,不可修改 const int& ra = a; // int& b = 10; // 該語句編譯時會出錯,b為常量 const int& b = 10; int c =20; const int& rc = c;//正確 double d = 12.34; //int& rd = d; // 該語句編譯時會出錯,在編譯時,d先給一個臨時變數,臨時變數再給rd,但是該臨時變數具有常屬性,即不可修改,所以錯誤 const int& rd = d;//加上const即正確 }
四、引用的作用(使用場景)
1.做引數
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
2.做返回值
int& TestRefReturn(int& a)
{
a += 10;
return a;
}
注意:如果函式返回時,離開函式作用域後,其棧上空間已經還給系統,因此不能用棧上的空間作為引用型別返回。如果以引用型別返回,返回值的生命週期必須不受函式的限制(即比函式生命週期長)。