每個(gè)人除了自己的名字之外,總有幾個(gè)綽號(hào),像水滸傳中李逵又叫黑旋風(fēng),C++中也有這么個(gè)概念,那就是引用,又稱別名。
引用不是新定義的一個(gè)變量,而是共用所引用變量的內(nèi)存空間,簡(jiǎn)而言之就是這個(gè)變量的別名。
#includeint main(){int a = 10;
int& ra = a;
ra = 100;
std::cout<< "a:"<< a<< std::endl; //a = 100
return 0;
}
二、引用的特性1、引用在定義時(shí)必須初始化;
2、一個(gè)變量可以有多個(gè)引用;(就像一個(gè)人有多個(gè)綽號(hào)一樣)
3、一旦引用了一個(gè)實(shí)體,則不能引用另外的實(shí)體;
眾所周知在函數(shù)參數(shù)傳遞時(shí),分為兩種,一種是值傳遞,一種是指針傳遞
如果想要修改實(shí)參,則值傳遞不能改變,而指針傳遞可以,但是指針傳遞可讀性差,也可能傳空指針過(guò)去,比較危險(xiǎn),麻煩。
這個(gè)時(shí)候“引用”的方式正是可以綜合它們倆的有點(diǎn),既可以改變值,又不用傳遞它的地址過(guò)去。
經(jīng)典的例子:兩個(gè)變量值交換,代碼如下:
#includevoid swap(int& a, int& b){int temp = a;
a = b;
b = temp;
}
int main(){int a = 10;
int b = 20;
printf("交換前a=%d,b=%d\n", a, b);
swap(a, b);
printf("交換后a=%d,b=%d\n", a, b);
return 0;
}
輸出為:
交換前a=10,b=20
交換后a=20,b=10
#includeint& Add(int a, int b){int c = a + b;
return c;
}
int main(){int& a = Add(1, 2);
Add(5, 6);
std::cout<< "a="<< a<< std::endl; //??這里會(huì)打印什么呢 是3嗎
return 0;
}
那么這里會(huì)打印3嗎,答案是否~,這里就需要注意的是函數(shù)調(diào)用完回收并不會(huì)空間釋放,而是仍然在分配的內(nèi)存那一塊
其實(shí)這一點(diǎn)跟指針很像,雖然在概念層是引用不會(huì)開(kāi)辟空間,只是共用實(shí)體的空間,其實(shí)在底層的實(shí)現(xiàn)上跟指針是一摸一樣的。
通過(guò)反匯編不難看出,指針和引用的賦值方式是一樣的 。
#include#includestruct A{int arr[10000];
};
//值傳遞
void TestFunc1(A a){}
//引用傳遞
void TestFunc2(A& a){}
//地址傳遞
void TestFunc3(A* a){}
void TestFunc(){A a;
size_t begin1 = clock();
for(size_t i = 0; i< 100000; i++){ TestFunc1(a);
}
size_t end1 = clock();
std::cout<< "值傳遞使用的時(shí)間為:"<< end1 - begin1<< std::endl;
size_t begin2 = clock();
for (size_t i = 0; i< 100000; i++){ TestFunc2(a);
}
size_t end2 = clock();
std::cout<< "引用傳遞使用的時(shí)間為:"<< end2 - begin2<< std::endl;
size_t begin3 = clock();
for (size_t i = 0; i< 100000; i++){TestFunc3(&a);
}
size_t end3 = clock();
std::cout<< "指針傳遞使用的時(shí)間為:"<< end3 - begin3<< std::endl;
}
int main(){for(size_t i = 0; i<= 10; i++){TestFunc();
}
return 0;
}
輸出為:
可以清晰的看出,值傳遞效率低,引用傳遞和指針傳遞效率差不多,這是因?yàn)橹祩鬟f的時(shí)候,會(huì)臨時(shí)拷貝一份傳過(guò)來(lái)的值,所以效率低下。
1、引用在定義時(shí)必須初始化,指針不用
2、指針有多級(jí)指針,引用則沒(méi)有
3、sizeof引用的變量是它類型原有內(nèi)存大小,指針則是根據(jù)計(jì)算機(jī)平臺(tái)位數(shù)來(lái)計(jì)算(64位是8個(gè)字節(jié))
4、沒(méi)有NULL引用,只有NULL指針
5、引用自加則實(shí)體自加,而指針自加是地址往后移動(dòng)
6、訪問(wèn)實(shí)體方式不同,指針需要解引用,引用編譯器會(huì)自己去解析處理
7、引用在初始化時(shí)引用了一個(gè)實(shí)體后,不能再引用另外的實(shí)體,而指針可以指向多個(gè)實(shí)體
8、引用對(duì)比指針而言相對(duì)安全
C++引用就此總結(jié)完畢,大家一起加油~~,明天又是美好的一天?。。?br />
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧