偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C++中引用和匿名對(duì)象的理解和本質(zhì)剖析

開(kāi)發(fā) 后端
如果生成的匿名對(duì)象在外部有對(duì)象等待被其實(shí)例化,此匿名對(duì)象的生命周期就變成了外部對(duì)象的生命周期;如果生成的匿名對(duì)象在外面沒(méi)有對(duì)象等待被其實(shí)例化,此匿名對(duì)象將會(huì)生成之后,立馬被析構(gòu)。

大家對(duì)C++的引用應(yīng)該都不陌生吧,抱著既要知其然,也要知其所以然的態(tài)度。下面將按照是什么?怎么用?為什么需要?本質(zhì)剖析的流程來(lái)向大家一一描述。

引用是什么?

引用其實(shí)就是給變量起的一個(gè)別名,使用這個(gè)別名跟使用變量名沒(méi)有區(qū)別。

那什么又是變量名呢?

變量名實(shí)質(zhì)上是一段連續(xù)存儲(chǔ)空間的別名,是一個(gè)標(biāo)號(hào)(門(mén)牌號(hào)),編譯器通過(guò)變量來(lái)申請(qǐng)并命名內(nèi)存空間,程序員可以通過(guò)變量的名字可以使用存儲(chǔ)空間。

也可以這樣理解,變量名是邏輯概念,變量是物理層面,變量含數(shù)據(jù)類(lèi)型和數(shù)據(jù)值,數(shù)據(jù)類(lèi)型決定內(nèi)存的分配,編譯器將變量名和變量對(duì)應(yīng)的內(nèi)存聯(lián)系起來(lái),使程序員可以通過(guò)變量名來(lái)操作內(nèi)存。

引用怎么用?

語(yǔ)法:Type& name = var;

規(guī)則:1、普通引用在聲明時(shí)必須用其它的變量進(jìn)行初始化

2、引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化(后面將通過(guò)引用本質(zhì)來(lái)解釋原因)

為什么需要引用?

1)引用作為其它變量的別名而存在,因此在一些場(chǎng)合可以代替指針

2)引用相對(duì)于指針來(lái)說(shuō)具有更好的可讀性和實(shí)用性

引用為java等高級(jí)的語(yǔ)言程序員提供了很大便利,其不需要了解C++中的指針,只需要按照以前的習(xí)慣來(lái)使用就可以。

引用的本質(zhì)剖析(很重要?。。?/p>

1、引用其實(shí)是個(gè)常量,證明如下

  1. int main() 
  2. int a = 1
  3. //int& b;   C++編譯器提示:錯(cuò)誤“b”,必須初始化引用-->說(shuō)明引用是個(gè)常量 
  4. int& b = a; 

說(shuō)明: 必須初始化引用–>說(shuō)明引用是個(gè)常量

2、引用其實(shí)也是個(gè)指針,證明如下

 

  1. struct teacher 
  2. int age;  //4個(gè)字節(jié) 
  3. teacher& m_techer; 
  4. }; 
  5.  
  6. struct student 
  7. int age;               //4個(gè)字節(jié) 
  8. short& weight; 
  9. }; 
  10.  
  11. int main() 
  12. cout說(shuō)明m_techer的 
  13.                                                      引用占4個(gè)字節(jié)*/ 
  14. cout說(shuō)明weight的引 
  15.                                                      用占4個(gè)字節(jié)*/ 
  16. system("pause"); 
  17. return 0

說(shuō)明:從上面teacher&和short&的兩個(gè)引用中占用的4個(gè)字節(jié)(32位系統(tǒng)),可以推斷出引用其實(shí)是個(gè)指針。

根據(jù)1、2的結(jié)論可以推斷出引用其實(shí)是個(gè)指針常量或者是常量指針,下面進(jìn)一步證明。

3、引用其實(shí)是個(gè)指針常量 ,證明如下

 

  1. int main() 
  2. int a =10
  3. int m = 22
  4.  
  5. int& b = a; 
  6. &b = &m;      /*疑問(wèn):  b是引用,引用是個(gè)指針,指針賦值為什么還要在取地址符&b 
  7.                      (因?yàn)榫幾g器在我們使用引用時(shí),自動(dòng)給引用披上了間接引用的外衣即:*b) 
  8.                  編譯錯(cuò)誤 “=”: 左操作數(shù)必須為左值-->引用是個(gè)指針常量,不能修改 
  9.                    其指針的指向。*/ 
  10.  
  11. system("pause"); 
  12. return 0

說(shuō)明:引用是個(gè)指針常量。下面會(huì)說(shuō)出C++編譯器是怎么在C語(yǔ)言的基礎(chǔ)上加入引用機(jī)制的。

4、C++編譯器在C語(yǔ)言的基礎(chǔ)上加入引用機(jī)制

 

說(shuō)明:

1、聲明引用時(shí),C語(yǔ)言將引用聲明的是指針常量。(為啥要初始化引用原因)

2、引用使用,C語(yǔ)言隱藏了對(duì)常指針自動(dòng)間接引用,讓我們完全不用了解指針

3、初始化引用時(shí),C語(yǔ)言隱藏了對(duì)變量的取地址符&操作,讓我們感覺(jué)是在直接給變量起別名

應(yīng)用的剖析到此就結(jié)束了,下面我們來(lái)說(shuō)說(shuō)匿名對(duì)象吧。

什么是匿名對(duì)象

匿名對(duì)象可以理解為是一個(gè)臨時(shí)對(duì)象,一般系統(tǒng)自動(dòng)生成的,如你的函數(shù)返回一個(gè)對(duì)象,這個(gè)對(duì)象在返回時(shí)會(huì)生成一個(gè)臨時(shí)對(duì)象。

匿名對(duì)象的生命周期(很重要?。。。?/p>

 

  1. class Cat 
  2. public
  3.     Cat() 
  4.     { 
  5.         cout<<"Cat類(lèi) 無(wú)參構(gòu)造函數(shù)"<<endl; 
  6.     } 
  7.  
  8.     Cat(Cat& obj) 
  9.     { 
  10.         cout<<"Cat類(lèi) 拷貝構(gòu)造函數(shù)"<<endl; 
  11.     } 
  12.  
  13.     ~Cat() 
  14.     { 
  15.         cout<<"Cat類(lèi) 析構(gòu)函數(shù) "<<endl; 
  16.     } 
  17.  
  18. }; 
  19.  
  20. void playStage() //一個(gè)舞臺(tái),展示對(duì)象的生命周期 
  21.     Cat();             /*在執(zhí)行此代碼時(shí),利用無(wú)參構(gòu)造函數(shù)生成了一個(gè)匿名Cat類(lèi)對(duì)象;執(zhí)行完此行代碼, 
  22.                             因?yàn)橥獠繘](méi)有接此匿名對(duì)象的變量,此匿名又被析構(gòu)了*/ 
  23.     Cat cc = Cat();    /*在執(zhí)行此代碼時(shí),利用無(wú)參構(gòu)造函數(shù)生成了一個(gè)匿名Cat類(lèi)對(duì)象;然后將此匿名變 
  24.                             成了cc這個(gè)實(shí)例對(duì)象,此匿名對(duì)象沒(méi)有被析構(gòu)。*/ 
  25.     cout<<"cc 對(duì)象好沒(méi)有被析構(gòu)"<<endl;    
  26.  
  27. int main() 
  28.     playStage(); 
  29.     system("pause"); 
  30.     return 0

輸出:

Cat類(lèi) 無(wú)參構(gòu)造函數(shù)
Cat類(lèi) 析構(gòu)函數(shù)
Cat類(lèi) 無(wú)參構(gòu)造函數(shù)
cc 對(duì)象好沒(méi)有被析構(gòu)
Cat類(lèi) 析構(gòu)函數(shù)

說(shuō)明:

1、在執(zhí)行playStage( )函數(shù)中的Cat( )時(shí),生成了一個(gè)匿名對(duì)象,執(zhí)行完Cat( )代碼后,此匿名對(duì)象就此消失。這就是匿名對(duì)象的生命周期。

2、在執(zhí)行playStage( )函數(shù)中Cat cc = Cat();時(shí),首先生成了一個(gè)匿名對(duì)象,因?yàn)橥獠坑衏c對(duì)象在等待被實(shí)例化,然后將此匿名對(duì)象變?yōu)榱薱c對(duì)象,其生命周期就變成了cc對(duì)象的生命周期。

總結(jié):

如果生成的匿名對(duì)象在外部有對(duì)象等待被其實(shí)例化,此匿名對(duì)象的生命周期就變成了外部對(duì)象的生命周期;如果生成的匿名對(duì)象在外面沒(méi)有對(duì)象等待被其實(shí)例化,此匿名對(duì)象將會(huì)生成之后,立馬被析構(gòu)。

***希望能對(duì)大家有幫助,沙米才疏學(xué)淺,有什么錯(cuò)誤請(qǐng)留言指正,謝謝大家。

責(zé)任編輯:王雪燕 來(lái)源: 沙米筆記
相關(guān)推薦

2010-01-20 18:24:51

C++CLI

2010-01-11 15:29:13

引用C++語(yǔ)言

2010-01-28 16:31:54

C++類(lèi)型

2012-02-13 10:18:42

C++ 11

2023-11-22 13:22:51

C++函數(shù)

2024-01-18 10:27:30

C++引用函數(shù)

2009-08-19 16:39:44

C#值類(lèi)型C#引用類(lèi)型

2011-07-13 16:14:53

C++引用指針

2013-05-27 15:38:37

Java對(duì)象C++

2011-07-20 15:58:53

C++引用

2009-08-27 17:51:34

C#匿名方法

2010-01-12 15:03:33

C++代碼

2024-12-16 16:10:31

2012-02-15 09:36:50

C++ 11

2022-07-26 00:36:06

C#C++函數(shù)

2011-04-11 13:00:08

C++結(jié)構(gòu)體枚舉

2010-01-14 17:42:47

CC++

2011-04-11 09:43:25

C++C

2024-01-03 13:38:00

C++面向?qū)ο缶幊?/a>OOP

2023-09-13 11:51:16

位域C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)