天天看點

c++引用極其底層實作

一、c++中引用的文法是這樣的:

int x = 100;

int& _x = x;

它的意思就是是給變量x起了一個别名,在以後的代碼中,_x其實就是x,這兩個是等價的。舉個例子,在《唐伯虎點秋香》中,唐伯虎叫做華安,又叫做9527,其實這三個名字都是同一個人,引用就是這個意思。

注意事項:

引用初始化的時候一定要綁定一個變量;

引用一旦初始化,則終身為這個變量服務;

不能傳回局部變量的引用,就像指針一樣,不能傳回局部變量的指針;

二、引用的幾處應用

1、普通的引用

int x = 100;

int& _x = x;

這裡還有一個問題,就是int& x = 100;如果寫成這樣,編譯器會報錯,對常數的引用必須加const修飾,const int& x = 100;

2、作為函數的形參

int max(int& x,int& y),這樣做的好處是沒有對實參進行複制拷貝,提高了效率。

3、引用作為函數的傳回值

對于這樣一個函數int max(int& x,int& y),我們可以這樣用int z = max(1,2),這很正常,我們都這樣用,但是你絕對不能這樣用max(1,2) = 100;也就是說,函數的傳回值不能作為左值。但是如果寫成這樣int& max(jint& x,int& y)之後,max(1,2) = 100這句話立馬就是合理的了。

#include <iostream>
using namespace std;
int& getmax(int& x1,int& y1){
	return x1 > y1 ? x1 : y1;
}
void main(){
	int x = 10;
	int y = 123;
	//int z = getmax(x,y);
	int& z = getmax(x,y);//用引用來接,和不用引用來接
	//int z = getmax(x, y);//對比一下,用引用來接傳回值,和不用引用來接有什麼差別
	getmax(x,y) = 1000;//把z和y全部綁到一起
	cout << z << endl;
	cout << y <<endl;
}
           

上面的代碼如果用引用來接,則輸出的z和y都是1000,如果注釋掉引用來接這一行,換成沒有用引用來接,則輸出的z和y是123,1000.

三、引用的實作

引用的特點就是:一個引用一旦引用了一個變量,就不能再去引用其他的變量了,但是引用的變量可以重新被指派。基于上面的特點,我們來看兩個指針:

int x = 100;

1:int const * pi = &x;

2:int  * const pi = &x;

第一個指針表示這個指針pi還可以解除目前綁定,然後綁定到其他指針上,但是所綁定對象的值不能被重新賦進去。就是說如果有int y = 100的話,pi = &y是合法的,但是*pi = 200就是不合法的。

第二個指針和第一個相反,*pi = 200是合法的,但是pi = &y是不合法,根據這兩個指針的性質,第二個指針就是引用的實作。