什么是引用
- 在c++中,可以使用引用可以起到跟指針類似的功能
如:
int age = 20;
// rAge就是一個引用
int &rAge = age;
- 引用相當于是變量的別名,可以用于基本數據類型、枚舉、結構、類、指針、數組等
如:
基本數據類型
int age = 20;
// rAge就是一個引用
int &rAge = age;
枚舉:
enum Season {
Spring,
Summer,
Fall,
Winter
};
Season season;
Season &rSeason = season;
rSeason = Winter;
cout << season << endl;
輸出結果為:3
結構體:
struct Student {
int age;
};
Student stu;
Student &rStu = stu;
rStu.age = 20;
cout << stu.age << endl;
輸出結果為:20
指針:
int a = 10;
int b = 20;
int *p = &a;
int * &rp = p;
rp = &b;
*p = 30;
cout << a << "," << b << endl;
輸出結果為:10,30
數組:
int array[] = {10, 20, 30};
int (&rArray)[3] = array;
cout << rArray[0] << endl;
輸出結果為:10
- 對引用做計算,就是對引用所指向的變量做計算
如:
int a = 10;
int b = 20;
int &ra = a;
int &rb = b;
int c = ra + rb;
cout << c << endl;
- 在定義引用的時候就必須初始化,一旦指向了某個變量。就不可以再改變,“從一而終”
- 可以利用引用初始化另一個引用,相當于某個變量的多個別名
如:
int a = 10;
int &ra = a;
int &rb = ra;
cout << ra << endl;
cout << rb << endl;
- 不存在引用的引用,指向引用的指針,引用數組
和指針的比較
- 比指針更安全,因為引用定義的時候就初始化了,指向了某個變量就不能再改變,所以比指針更安全
- 函數的返回值可以被賦值
如:
int age = 10;
int &func(){
return age;
}
func() = 30;
cout << "a = " << age << endl;
輸出結果:a = 30
const
- const就是常量的意思,器修飾的變量不可改變
-如果是修飾的是類、結構體(的指針),其成員也不可改變 - const 修飾的是它右邊的功能
如 :
int age = 10;
const int *p0 = &age;
int const *p1 = &age;
const int * const p3 = &age;
int const * const p4 = &age;
因為const總是修飾他右邊,所有*po 和 *p1 都是常量 po和p1 是變量,
而p3 和 p4 p3和p4,都被const 修飾了,所有他們都是常量 。
常引用
- 引用也是可以被const修飾的,這樣就無法通過引用修改數據了,我們可以稱為常引用
- const必須寫在&符號的左邊,才能算常引用
如
int age = 10;
int const &rage = age;
- 常引用可以指向不同類型的數據
- 常用語可作為函數參數(此規則也是用與const的指針)
如:
int sum(const int &a, const int &b){
return a + b;
}
有如下的特點
1、可以接受const和非const的實參(而非const的引用,只能接受非const實參)
int v1 = 10;
int v2 = 20;
sum(v1, v2);
const int v3 = 30;
const int v4 = 40;
cout << sum(v3, v4) << endl;
2、可以和非const引用構成重載
如:
int sum(const int &a, const int &b){
return a + b;
}
int sum(int &a, int &b){
return a + b;
}
- 當常引用指向了不同類型的數據時,會產生臨時變量,就是引用指向的并不是初始化時的那個變量