大家對C++的引用應(yīng)該都不陌生吧井仰,抱著既要知其然埋嵌,也要知其所以然的態(tài)度。
下面將按照是什么俱恶?怎么用雹嗦?為什么需要?本質(zhì)剖析的流程來向大家一一描述合是。
引用是什么了罪?##
引用其實(shí)就是給變量起的一個(gè)別名,使用這個(gè)別名跟使用變量名沒有區(qū)別端仰。
那什么又是變量名呢捶惜?###
變量名實(shí)質(zhì)上是一段連續(xù)存儲空間的別名,是一個(gè)標(biāo)號(門牌號)荔烧,編譯器通過變量來申請并命名內(nèi)存空間吱七,程序員可以通過變量的名字可以使用存儲空間。
也可以這樣理解鹤竭,變量名是邏輯概念踊餐,變量是物理層面,變量含數(shù)據(jù)類型和數(shù)據(jù)值臀稚,數(shù)據(jù)類型決定內(nèi)存的分配吝岭,編譯器將變量名和變量對應(yīng)的內(nèi)存聯(lián)系起來,使程序員可以通過變量名來操作內(nèi)存。
引用怎么用窜管?###
語法:Type& name = var;
規(guī)則:1散劫、普通引用在聲明時(shí)必須用其它的變量進(jìn)行初始化
2、引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化(后面將通過引用本質(zhì)來解釋原因)
為什么需要引用幕帆?###
1获搏、引用作為其它變量的別名而存在,因此在一些場合可以代替指針
2失乾、引用相對于指針來說具有更好的可讀性和實(shí)用性
引用為java等高級的語言程序員提供了很大便利常熙,其不需要了解C++中的指針,只需要按照以前的習(xí)慣來使用就可以碱茁。
引用的本質(zhì)剖析###
1裸卫、引用其實(shí)是個(gè)常量
<pre>
int main()
{
int a = 1;
//int& b; C++編譯器提示:錯(cuò)誤“b”,必須初始化引用-->說明引用是個(gè)常量
int& b = a;
}
</pre>
<strong>說明: </strong>必須初始化引用-->說明引用是個(gè)常量
2纽竣、引用其實(shí)也是個(gè)指針
<pre>
struct teacher
{
int age; //4個(gè)字節(jié)
teacher& m_techer;
};
struct student
{
int age; //4個(gè)字節(jié)
short& weight;
};
int main()
{
cout<<"sizeof(teacher):"<<sizeof(teacher)<<endl; /輸出sizeof(teacher):8-->說明m_techer的引用占4個(gè)字節(jié)/
cout<<"sizeof(student):"<<sizeof(student)<<endl; /輸出sizeof(student):8-->說明weight的引用占4個(gè)字節(jié)/
system("pause");
return 0;
}
</pre>
<strong>說明: </strong>從上面teacher&和short&的兩個(gè)引用中占用的4個(gè)字節(jié)(32位系統(tǒng))墓贿,可以推斷出引用其實(shí)是個(gè)指針。根據(jù)1退个、2的結(jié)論可以推斷出引用其實(shí)是個(gè)指針常量或者是常量指針
3募壕、引用其實(shí)是個(gè)指針常量
<pre>
int main()
{
int a =10;
int m = 22;
int& b = a;
&b = &m;
system("pause");
return 0;
}
</pre>
<strong>說明: </strong>引用是個(gè)指針常量调炬。下面會(huì)說出C++編譯器是怎么在C語言的基礎(chǔ)上加入引用機(jī)制的语盈。
4、C++編譯器在C語言的基礎(chǔ)上加入引用機(jī)制
![F~Z)XONQ)Y1$Z(C]V4{XRC6.png](http://upload-images.jianshu.io/upload_images/1745406-f8aad157e56ec9c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<strong>說明: </strong>1缰泡、聲明引用時(shí)刀荒,C語言將引用聲明的是指針常量。(為啥要初始化引用原因)
2棘钞、引用使用缠借,C語言隱藏了對常指針自動(dòng)間接引用,讓我們完全不用了解指針
3宜猜、初始化引用時(shí)泼返,C語言隱藏了對變量的取地址符&操作,讓我們感覺是在直接給變量起別名
應(yīng)用的剖析到此就結(jié)束了姨拥,下面我們來說說匿名對象吧绅喉。
匿名對象##
匿名對象可以理解為是一個(gè)臨時(shí)對象,一般系統(tǒng)自動(dòng)生成的叫乌,如你的函數(shù)返回一個(gè)對象柴罐,這個(gè)對象在返回時(shí)會(huì)生成一個(gè)臨時(shí)對象。
匿名對象的生命周期###
<pre>
class Cat
{
public:
Cat()
{
cout<<"Cat類 無參構(gòu)造函數(shù)"<<endl;
}
Cat(Cat& obj)
{
cout<<"Cat類 拷貝構(gòu)造函數(shù)"<<endl;
}
~Cat()
{
cout<<"Cat類 析構(gòu)函數(shù)"<<endl;
}
};
void playStage() //一個(gè)舞臺憨奸,展示對象的生命周期
{
Cat();
Cat cc = Cat();
cout<<"cc 對象好沒有被析構(gòu)"<<endl;
}
int main()
{
playStage();
system("pause");
return 0;
}
</pre>
輸出
<pre>
Cat類 無參構(gòu)造函數(shù)
Cat類 析構(gòu)函數(shù)
Cat類 無參構(gòu)造函數(shù)
cc 對象好沒有被析構(gòu)
Cat類 析構(gòu)函數(shù)
</pre>
<strong>說明:</strong>1革屠、在執(zhí)行playStage( )函數(shù)中的Cat( )時(shí),生成了一個(gè)匿名對象,執(zhí)行完Cat( )代碼后似芝,此匿名對象就此消失那婉。這就是匿名對象的生命周期。
2党瓮、在執(zhí)行playStage( )函數(shù)中Cat cc = Cat();時(shí)吧恃,首先生成了一個(gè)匿名對象,因?yàn)橥獠坑衏c對象在等待被實(shí)例化麻诀,然后將此匿名對象變?yōu)榱薱c對象痕寓,其生命周期就變成了cc對象的生命周期。
<strong>總結(jié):</strong>如果生成的匿名對象在外部有對象等待被其實(shí)例化蝇闭,此匿名對象的生命周期就變成了外部對象的生命周期呻率;如果生成的匿名對象在外面沒有對象等待被其實(shí)例化,此匿名對象將會(huì)生成之后呻引,立馬被析構(gòu)礼仗。
原文鏈接