真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

  • 引用是什么?

    10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有平桂免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

引用其實就是給變量起的一個別名,使用這個別名跟使用變量名沒有區(qū)別。

  • 那什么又是變量名呢?

變量名實質(zhì)上是一段連續(xù)存儲空間的別名,是一個標(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、普通引用在聲明時必須用其它的變量進(jìn)行初始化

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

  • 為什么需要引用?

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

2)引用相對于指針來說具有更好的可讀性和實用性

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

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

1、引用其實是個常量,證明如下

大家對C++的引用應(yīng)該都不陌生吧,抱著既要知其然,也要知其所以然的態(tài)度。

下面將按照是什么?怎么用?為什么需要?本質(zhì)剖析的流程來向大家一一描述。

1、引用其實是個常量,證明如下


int main() 

{  

        int a = 1;    

        //int& b;   C++編譯器提示:錯誤“b”,必須初始化引用-->說明引用是個常量     

        int& b = a;

 }


   說明: 必須初始化引用-->說明引用是個常量

   2、引用其實也是個指針,證明如下


struct teacher

{

    int age;       //4個字節(jié)

    teacher& m_techer;

};

 

struct student

{

    int age;               //4個字節(jié)

    short& weight;

};

 

int main()

{

    cout<<"sizeof(teacher):"<<sizeof(teacher)</*輸出sizeof(teacher):8-->說明m_techer的引用占4個字節(jié)*/

    cout<<"sizeof(student):"<<sizeof(student)</*輸出sizeof(student):8-->說明weight的引用占4個字節(jié)*/

    system("pause");

    return 0;

}


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

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


3、引用其實是個指針常量 ,證明如下


int main()

{

    int a =10;

    int m = 22;

 

    int& b = a;

    &b = &m;     /*疑問:  b是引用,引用是個指針,指針賦值為什么還要在取地址符&b(因為編譯器在我們使用引用時,自動給引用披上了間接引用的外衣即:*b)編譯錯誤 “=”: 左操作數(shù)必須為左值-->引用是個指針常量,不能修改其指針的指向。*/

     

    system("pause");

    return 0;

}


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


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


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

                     2、引用使用,C語言隱藏了對常指針自動間接引用,讓我們完全不用了解指針

                     3、初始化引用時,C語言隱藏了對變量的取地址符&操作,讓我們感覺是在直接給變量起別名

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


  •   什么是匿名對象

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

  •    匿名對象的生命周期(很重要?。。。?/strong>


class Cat

{

public:

    Cat()

    {

        cout<<"Cat類 無參構(gòu)造函數(shù)"<

    }

 

    Cat(Cat& obj)

    {

        cout<<"Cat類 拷貝構(gòu)造函數(shù)"<

    }

 

    ~Cat()

    {

        cout<<"Cat類 析構(gòu)函數(shù) "<

    }

 

};

 

void playStage() //一個舞臺,展示對象的生命周期

{

    Cat();             /*在執(zhí)行此代碼時,利用無參構(gòu)造函數(shù)生成了一個匿名Cat類對象;執(zhí)行完此行代碼,因為外部沒有接此匿名對象的變量,此匿名又被析構(gòu)了*/

    Cat cc = Cat();    /*在執(zhí)行此代碼時,利用無參構(gòu)造函數(shù)生成了一個匿名Cat類對象;然后將此匿名變成了cc這個實例對象,此匿名對象沒有被析構(gòu)。*/

    cout<<"cc 對象好沒有被析構(gòu)"<

}

int main()

{

    playStage();

    system("pause");

    return 0;

}


輸出:


Cat類 無參構(gòu)造函數(shù)

Cat類 析構(gòu)函數(shù)

Cat類 無參構(gòu)造函數(shù)

cc 對象好沒有被析構(gòu)

Cat類 析構(gòu)函數(shù)

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

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

總結(jié):

          如果生成的匿名對象在外部有對象等待被其實例化,此匿名對象的生命周期就變成了外部對象的生命周期;

          如果生成的匿名對象在外面沒有對象等待被其實例化,此匿名對象將會生成之后,立馬被析構(gòu)。

說明: 必須初始化引用-->說明引用是個常量


分享題目:C++中引用和匿名對象的理解和本質(zhì)剖析
網(wǎng)頁地址:http://weahome.cn/article/iiceoc.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部