[轉(zhuǎn)]C++中引用和匿名對象的理解和本質(zhì)剖析

大家對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)礼仗。


原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逻悠,隨后出現(xiàn)的幾起案子元践,更是在濱河造成了極大的恐慌,老刑警劉巖童谒,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单旁,死亡現(xiàn)場離奇詭異,居然都是意外死亡饥伊,警方通過查閱死者的電腦和手機(jī)象浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琅豆,“玉大人愉豺,你說我怎么就攤上這事∶R颍” “怎么了蚪拦?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冻押。 經(jīng)常有香客問我驰贷,道長,這世上最難降的妖魔是什么翼雀? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任饱苟,我火速辦了婚禮,結(jié)果婚禮上狼渊,老公的妹妹穿的比我還像新娘箱熬。我一直安慰自己类垦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布城须。 她就那樣靜靜地躺著蚤认,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糕伐。 梳的紋絲不亂的頭發(fā)上砰琢,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音良瞧,去河邊找鬼陪汽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褥蚯,可吹牛的內(nèi)容都是我干的挚冤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼赞庶,長吁一口氣:“原來是場噩夢啊……” “哼训挡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歧强,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澜薄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后摊册,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肤京,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年丧靡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆沫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡温治,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒悠,到底是詐尸還是另有隱情熬荆,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布绸狐,位于F島的核電站卤恳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寒矿。R本人自食惡果不足惜突琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望符相。 院中可真熱鬧拆融,春花似錦蠢琳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趟脂,卻和暖如春泰讽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昔期。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工已卸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硼一。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓咬最,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欠动。 傳聞我的和親對象是個(gè)殘疾皇子永乌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容