原文鏈接
引用是什麼
引用不是重新定義一個變量,而是給一個已經存在的變量取的別名。
語法:類型& 引用變量名=已定義的變量名
引用的特點:
1、一個變量可以有多個別名。
2、引用必須初始化。
3、引用只能在初始化的時候使用一次,不能在作爲其它變量的別名。
引用注意事項:
1.引用必須被初始化;
2.引用一旦與初始值對象綁定,就不會變化(引用從一而終)!!!
3.引用初始值必須爲一個對象,不能使常數
4.引用必須與被引用的對象類型一致
重點:作用在引用上的所有操作事實上都是作用在該引用所綁定的對象上。
使用引用有何優點?
在傳參的時候,使用指針傳參,編譯器需要給指針另行分配存儲單元,存儲一個該指針的副本,在函數中對這個副本進行操作;而使用引用傳參,編譯器就不需要分配存儲空間和保存副本了,函數將直接對實參進行操作。所以使用引用使得程序的運行速度更快,執行效率更高。
我們可以看出別名和本來的變量指向同一塊空間,是否引用變量的改變會引起原有變量的改變?
const引用
#include<iostream>
using namespace std;
void test(){
int a = 4;
const int& b = a;
a = 10; //a改變b也會隨之改變
//b = 12; //常量不可以賦值
const int c = 3;
const int& d = c;
//int& e = d; //類型不匹配
const int& e = d;//常量具有常性,只有const修飾的引用才能引用常量
double f = 1.1;
//int& g = f;
const int& g = f;
//double 無法轉爲int& ,
//f在賦值時候會生成一個臨時變量,臨時變量具有常性,所以不能賦值
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
引用做參數
以Swap函數爲例,比較值傳遞、址傳遞,引用傳遞。
#include<iostream>
using namespace std;
//值傳遞,無法實現交換兩值的效果
void Swap1(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
//址傳遞
void Swap2(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
//傳引用
void Swap3(int& a, int& b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 10;
int b = 20;
int& c = a;
int& d = b;
Swap1(a, b);// 10 20
cout << a;
cout << b << endl;
Swap3(c, d);//20 10
cout << a;
cout << b << endl;
Swap2(&a, &b);//10 20此處是將上次交換後的20 10再次交換
cout << a;
cout << b << endl;
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
所以說在傳參這一塊引用和指針一樣可以避免傳值,形參是實參的臨時拷貝,所以形參改變不會影響到實參。
….總結:傳參傳結構體時要避免直接傳結構體,因爲一旦結構體存在數組時,會先開好等大的空間然後一步步將數據拷進去,這樣就會很低效。
引用做返回值
#include<iostream>
using namespace std;
//傳值做返回值
int Add(int a, int b){
int ret = a + b;
return ret;
}
int& Add1(int a, int b){
int ret = a + b;
return ret;
}
void test(){
int a = 6;
int b = 4;
int c = Add(a, b);
int d = Add1(a, b);
}
int main()
{
test();
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
…….結論:
1、不要返回一個臨時變量的引用。
2、如果返回對象出了作用域仍然存在,儘量使用引用作爲返回值,會更加高效。
指針和引用的區別與聯繫:
1、引用只能在定義時初始化一次,之後不可以改變指向其他變量;指針變量的值可變。
2、引用必須指向有效的變量,指針可以爲NULL。
3、sizeof(引用)得到所指向變量的大小,sizeof(指針)得到指向變量的地址的大小
4、指針++,加的是所指向類型的大小,引用++加的是1,加在變量上。
5、指針會有野指針的風險,所以引用相較於指針更加安全。