青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-4  評論-40  文章-117  trackbacks-0

 

C++中真正的臨時對象是看不見的,它們不出現(xiàn)在你的源代碼中,臨時對象的產(chǎn)生在如下幾個時刻:

 

1.       用構(gòu)造函數(shù)作為隱式類型轉(zhuǎn)換函數(shù)時,會創(chuàng)建臨時對象。

例:

        class Integer

        {

        public:

               Integer(int i)

               :m_val(i)

{}

~Integer()

{}

 

private:

       int   m_val;

                     };

 

                     void Calculate(Integer itgr)

                     {

                            // do something

                     }

              那么語句:  int  i = 10;

                                   Calculate(i);

              會產(chǎn)生一個臨時對象,作為實參傳遞到Calculate 函數(shù)中。

 

2.       建立一個沒有命名的非堆(non-heap)對象,也就是無名對象時,會產(chǎn)生臨時對象。

如:

        Integer& iref = Integer(5);           //用無名臨時對象初始化一個引用,等價于

                                                         //Integer iref(5);

 

        Integer  itgr = Integer(5);           //用一個無名臨時對象拷貝構(gòu)造另一個對象

        按理說,C++應(yīng)先構(gòu)造一個無名的臨時對象,再用它來拷貝構(gòu)造itgr,由于

該臨時對象拷貝構(gòu)造 itgr 后,就失去了任何作用,所以對于這種類型(只起拷貝構(gòu)造另一個對象的作用)的臨時對象,c++特別將其看做: Integer itgr(5); 即直接以相同參數(shù)構(gòu)造目標(biāo)對象,省略了創(chuàng)建臨時對象這一步。

 

Calculate( Integer(5) );                       //無名臨時對象作為實參傳遞給形參,函數(shù)調(diào)

//用表達(dá)式結(jié)束后,臨時對象生命期結(jié)束,被//析構(gòu).

3.       函數(shù)返回一個對象值時,會產(chǎn)生臨時對象,函數(shù)中的返回值會以值拷貝的形式拷貝到被調(diào)函數(shù)棧中的一個臨時對象。

如:

        Integer Func()

        {

               Integer itgr;

               return itgr;

        }

 

        void main()

        {

               Integer in;

               in = Func();

        }

表達(dá)式 Func() 處創(chuàng)建了一個臨時對象,用來存儲Func() 函數(shù)中返回的對象,臨時對象由 Func() 中返回的 itgr 對象拷貝構(gòu)造(值傳遞),臨時對象賦值給 in后,賦值表達(dá)式結(jié)束,臨時對象被析構(gòu)。見下圖:

 


 

看看如下語句:

                      Integer& iRef = Func();

該語句用一個臨時對象去初始化iRef 引用,一旦該表達(dá)式執(zhí)行結(jié)束,臨時對象的生命周期結(jié)束,便被結(jié)束,iRef引用的尸體已經(jīng)不存在,接下來任何對 iRef 的操作都是錯誤的。

 

 

 

 

下面,來看看實際的測試結(jié)果,代碼如下:

 

 

class VECTOR3

{

public:

    VECTOR3()

       :x(0.0f),y(0.0f),z(0.0f)

    {

       std::cout<<"VECTOR3 Default Constructor "

               <<std::setiosflags(std::ios_base::hex)<<this

               <<std::endl;

    }

 

    VECTOR3(float fx, float fy, float fz)

       :x(0.0f),y(0.0f),z(0.0f)

    {

       std::cout<<"VECTOR3 Parameter Constructor "

               <<std::setiosflags(std::ios_base::hex)<<this

               <<std::endl;

    }

 

    VECTOR3(const VECTOR3& rht)

       :x(rht.x), y(rht.y), z(rht.z)

    {

       std::cout<<"VECTOR3 Copy Constructor "

           <<std::setiosflags(std::ios_base::hex)<<this

           <<" from rht : "

           <<std::setiosflags(std::ios_base::hex)<<&rht

           <<std::endl;

    }

 

    ~VECTOR3()

    {

       std::cout<<"VECTOR3 Destructor "

               <<std::setiosflags(std::ios_base::hex)<<this

               <<std::endl;

    }

 

    VECTOR3& operator = (const VECTOR3& rht)

    {

       if( &rht == this )

           return *this;

 

       x = rht.x;

       y = rht.y;

       z = rht.z;

 

       std::cout<<"VECTOR3 operator = left oper : "

               <<std::setiosflags(std::ios_base::hex)<<this

               <<" right oper : "

               <<std::setiosflags(std::ios_base::hex)<<&rht

               <<std::endl;

 

       return *this;

    }

private:

    float x;

    float y;

    float z;

};

 

VECTOR3 Func1()

{

    return VECTOR3(1.0f, 1.0f, 1.0f);

}

 

VECTOR3 Func2()

{

    VECTOR3 ret;

    ret.x = 2.0f;

    ret.y = 2.0f;

    ret.z = 2.0f;

    return ret;

}

 

 

void main()

{

VECTOR3 v1 = Func1();

    v1 = Func1();

 

VECTOR3 v2 = Func2();

        

VECTOR3 v3;

v3 = Func2();

}

 

分析:

<1>.

VECTOR3 v1 = Func1();

該語句的執(zhí)行過程本該是:

    1>. Func1() 中構(gòu)造一個無名對象

    2>. Func1() 中的無名對象拷貝構(gòu)造調(diào)用表達(dá)式處的臨時對象

    3>. 再由臨時對象拷貝構(gòu)造v1

    4>. Func1() 返回,析構(gòu)無名對象

    5>. 整個語句結(jié)束,析構(gòu)臨時對象

但是c++ 會優(yōu)化上述過程,省略了 1>. 2>. 處的臨時對象創(chuàng)建,直接以

1.0f, 1.0f, 1.0f 為參數(shù)構(gòu)造v1,這樣只會有一次構(gòu)造函數(shù)的調(diào)用。結(jié)果

如圖:

 

<2>.

    v1 = Func1();

該語句的執(zhí)行過程本該是:

    1>. Func1() 中構(gòu)造一個無名對象

    2>. Func1() 中的無名對象拷貝構(gòu)造調(diào)用表達(dá)式處的臨時對象

    3>. 再由臨時對象賦值給v1 (賦值運(yùn)算符)

    4>. Func1() 返回,析構(gòu)無名對象

    5>. 整個語句結(jié)束,析構(gòu)臨時對象

但是c++ 會優(yōu)化上述過程,省略了 1>. 處的無名臨時對象創(chuàng)建,直接以

1.0f, 1.0f, 1.0f 為參數(shù)構(gòu)造調(diào)用表達(dá)式處的臨時對象,因為是賦值,所以這個臨時對象是無法被優(yōu)化的,賦值完畢后,表達(dá)式結(jié)束,臨時對象被析構(gòu)。結(jié)果如圖:

 

<3>.

    VECTOR3 v2 = Func2();

該語句的執(zhí)行過程本該是:

    1>. Func2() 中的 ret 拷貝構(gòu)造調(diào)用表達(dá)式處的臨時對象

    2>. 該臨時對象拷貝構(gòu)造v2

    3>. 析構(gòu)臨時對象

但是c++ 會優(yōu)化上述過程,省略了創(chuàng)建臨時對象這一步,直接由ret拷貝

構(gòu)造v2,就一次拷貝構(gòu)造函數(shù)的代價。

結(jié)果如圖:

 

<4>.

           VECTOR3 v3;

    v3 = Func2();

執(zhí)行過程如下:

    1>. 構(gòu)造v3

    2>. 進(jìn)入Func2(),構(gòu)造ret

    3>. 返回ret,用ret拷貝構(gòu)造到調(diào)用表達(dá)式處的臨時對象

    4>. Func2()結(jié)束,ret被析構(gòu)

    5>. 臨時對象賦值給v3

    6>. 賦值表達(dá)式結(jié)束,析構(gòu)臨時對象

結(jié)果如圖:

 

 

 

綜上所述,可得如下結(jié)論:

<1>. 在使用一個臨時對象( 可能是無名對象 或者 返回對象值時 ) 創(chuàng)建構(gòu)造另一個對象的過程的中,c++會優(yōu)化掉該臨時對象的產(chǎn)生,直接以相同參數(shù)調(diào)用相關(guān)構(gòu)造函數(shù)構(gòu)或者 直接調(diào)用拷貝構(gòu)造函數(shù) 到 目標(biāo)對象.

     

<2>. 若不是對象創(chuàng)建,而是對象賦值,則在賦值表達(dá)式的右值處的臨時對象

      創(chuàng)建不能省略,臨時對象賦值給左值后,表達(dá)式結(jié)束,臨時對象被析構(gòu)。

 

posted on 2010-02-25 14:44 李陽 閱讀(4814) 評論(6)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 關(guān)于C++中的臨時對象問題[未登錄] 2011-07-19 01:06 | Leo
謝謝樓主的點(diǎn)撥,深受啟發(fā),解決了心中的困惑  回復(fù)  更多評論
  
# re: 關(guān)于C++中的臨時對象問題 2013-05-13 16:53 | 教獸
我覺得樓主有些說的并不準(zhǔn)確  回復(fù)  更多評論
  
# re: 關(guān)于C++中的臨時對象問題 2013-07-12 18:02 | PJ
哪里不準(zhǔn)確 ?@教獸
  回復(fù)  更多評論
  
# re: 關(guān)于C++中的臨時對象問題 2013-07-12 18:02 | PJ
哪里不準(zhǔn)確 ?   回復(fù)  更多評論
  
# re: 關(guān)于C++中的臨時對象問題 2013-07-18 15:50 | lite3
我在VC++ 2010版中, 發(fā)現(xiàn)release版和debug版的運(yùn)行結(jié)果不一致,release版里沒有調(diào)用復(fù)制構(gòu)造函數(shù)。  回復(fù)  更多評論
  
# re: 關(guān)于C++中的臨時對象問題 2014-05-01 03:17 | xmj
Integer &a = Integer( 5 )編譯通不過  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线成人av.com| 亚洲在线视频网站| 在线视频日本亚洲性| 亚洲激情网站| 亚洲裸体俱乐部裸体舞表演av| 狠狠色伊人亚洲综合网站色| 伊人激情综合| 亚洲精品久久在线| 亚洲综合精品自拍| 久久理论片午夜琪琪电影网| 久久精品一区二区三区中文字幕| 久久久精品国产一区二区三区| 久久野战av| 亚洲精品一二三| 亚洲欧美在线免费| 美日韩精品视频| 欧美午夜剧场| 一区二区三区我不卡| 亚洲精品欧美| 久久国产精品黑丝| 亚洲国产高清高潮精品美女| 亚洲乱码视频| 久久精品国产免费观看| 欧美精品福利在线| 国产婷婷一区二区| 99视频在线观看一区三区| 欧美亚洲午夜视频在线观看| 欧美jizz19性欧美| 亚洲综合欧美日韩| 欧美精品日韩| 在线看片日韩| 欧美一区二区三区在线| 亚洲黄色天堂| 久久久www| 国产精品wwwwww| 亚洲精品人人| 亚洲国产综合在线| 久久婷婷综合激情| 国产精品日日做人人爱| 亚洲日本乱码在线观看| 欧美一区三区三区高中清蜜桃| 欧美国产日本韩| 欧美一区二区网站| 国产精品劲爆视频| 亚洲美女在线国产| 欧美电影免费观看| 久久国产精品99精品国产| 欧美日韩一级大片网址| 亚洲国产精品毛片| 巨胸喷奶水www久久久免费动漫| 日韩视频一区| 欧美乱妇高清无乱码| 91久久精品国产91性色| 久久亚洲国产成人| 久久av一区二区| 国产精品尤物福利片在线观看| 日韩亚洲欧美综合| 亚洲激情在线观看| 欧美精品 国产精品| 亚洲日本在线观看| 欧美激情一区三区| 欧美激情黄色片| 亚洲黄色三级| 91久久久精品| 欧美日韩小视频| 一区二区三区黄色| 夜夜爽夜夜爽精品视频| 欧美日韩一区二区在线观看| 一本久久a久久精品亚洲| 亚洲欧洲日产国码二区| 久热re这里精品视频在线6| 国产一区二区三区电影在线观看 | 欧美成人情趣视频| 久久久美女艺术照精彩视频福利播放 | 国内精品国产成人| 久久久久国色av免费看影院| 亚洲一区免费在线观看| 国产精品久久久久秋霞鲁丝| 亚洲欧美中文日韩v在线观看| 在线亚洲电影| 国产精品美女黄网| 久久久青草婷婷精品综合日韩 | 在线视频亚洲一区| 亚洲社区在线观看| 国产在线欧美| 欧美ed2k| 国产精品久线观看视频| 久久婷婷麻豆| 欧美精品一区二区三区蜜桃 | 久久国产视频网| 亚洲国产99| 亚洲精选在线观看| 国产日韩高清一区二区三区在线| 久久伊人免费视频| 欧美激情女人20p| 亚洲一区不卡| 性欧美8khd高清极品| 亚洲高清资源综合久久精品| 99国产精品视频免费观看一公开| 欧美视频一区二区| 老巨人导航500精品| 欧美巨乳在线| 亚洲欧美在线另类| 麻豆精品视频在线观看| 性一交一乱一区二区洋洋av| 久久国内精品视频| 亚洲午夜精品久久| 久久综合给合久久狠狠色| 亚洲免费一区二区| 欧美mv日韩mv国产网站| 久久精品成人欧美大片古装| 免费视频一区| 免费久久99精品国产自| 欧美日韩美女| 亚洲国产高清一区| 国内成+人亚洲+欧美+综合在线| 欧美国产日韩免费| 国语自产精品视频在线看| 正在播放欧美一区| 一区二区久久久久| 免费观看日韩| 久久精品国产欧美激情| 国产精品久久久久国产a级| 欧美国产日韩一区二区三区| 国产色婷婷国产综合在线理论片a| 亚洲电影免费在线观看| 黑人一区二区三区四区五区| 亚洲午夜精品在线| 亚洲综合色在线| 欧美日韩免费在线视频| 欧美激情在线播放| 亚洲成色999久久网站| 久久久综合精品| 美女精品国产| 在线免费一区三区| 久久免费视频这里只有精品| 久久国产一区二区| 国产欧美日韩亚州综合| 午夜精品成人在线视频| 久久久蜜桃精品| 亚洲高清在线观看| 欧美美女操人视频| 亚洲视频电影在线| 久久精品国产99精品国产亚洲性色| 国产伦精品一区| 午夜在线精品偷拍| 久久久久久久久久久久久9999| 国产偷久久久精品专区| 久久精品国产亚洲aⅴ| 老鸭窝亚洲一区二区三区| 1024成人网色www| 欧美精品一区二区三区在线播放| 亚洲日韩欧美视频| 午夜国产精品影院在线观看| 久久一区中文字幕| 亚洲一区二区三区高清不卡| 日韩一级不卡| 国产精品久久久91| 午夜久久影院| 亚洲福利av| 亚洲综合视频1区| 国产一区二区黄| 欧美成人国产va精品日本一级| 亚洲精品欧美日韩| 久久精品国产v日韩v亚洲| 在线播放视频一区| 欧美日韩1080p| 午夜日韩在线观看| 欧美激情精品久久久久久黑人| 日韩天天综合| 国产日韩在线播放| 欧美激情精品久久久久久久变态| 中日韩高清电影网| 欧美激情视频给我| 久久爱www久久做| 日韩一区二区久久| 一色屋精品视频免费看| 欧美女人交a| 久久久不卡网国产精品一区| 日韩视频在线观看免费| 久久久噜噜噜久久| 亚洲欧美国产日韩天堂区| 在线日韩av片| 国产精品你懂的在线欣赏| 麻豆9191精品国产| 欧美自拍偷拍午夜视频| 夜夜嗨av一区二区三区| 欧美福利电影网| 久久成人综合视频| 亚洲小说欧美另类婷婷| 亚洲第一精品久久忘忧草社区| 欧美日韩在线第一页| 久久亚洲综合网| 欧美一区91| 亚洲欧美经典视频| 9l国产精品久久久久麻豆| 亚洲成人在线视频网站| 亚洲精品国产欧美| 国产三级欧美三级| 国产精品日韩在线|