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

隨筆-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电影| 久久久久99| 亚洲高清影视| 亚洲精品国精品久久99热一| 欧美韩日一区二区| 亚洲一区国产视频| 久久久久久久性| 国产精品久久二区二区| 小嫩嫩精品导航| 欧美亚洲一区二区三区| 在线播放不卡| 99精品免费视频| 国产日韩欧美另类| 欧美国产视频在线| 国产精品久久久久久影院8一贰佰| 午夜老司机精品| 可以免费看不卡的av网站| 在线亚洲自拍| 久久精品二区三区| 亚洲午夜视频| 久久视频免费观看| 亚洲欧美国产77777| 久久久久久伊人| 亚洲一区视频在线| 美女性感视频久久久| 亚洲综合大片69999| 久久综合国产精品| 欧美一级二级三级蜜桃| 欧美成年人视频网站| 欧美一区二区三区视频免费| 欧美+日本+国产+在线a∨观看| 亚洲视频自拍偷拍| 久久资源在线| 久久成人免费日本黄色| 欧美日韩爆操| 欧美成人精品在线播放| 国产精品欧美日韩一区| 亚洲精品国产精品国自产在线 | 久久亚洲国产成人| 欧美一级久久| 欧美日韩在线亚洲一区蜜芽| 裸体素人女欧美日韩| 国产精品一区免费在线观看| 亚洲国产高清aⅴ视频| 国模叶桐国产精品一区| 亚洲一区二区三区四区在线观看| 亚洲精品中文字幕有码专区| 久久久夜精品| 久久综合久久久| 国产亚洲人成网站在线观看| 亚洲视频播放| 亚洲曰本av电影| 欧美日本国产| 亚洲人体大胆视频| 亚洲日本免费| 欧美国产极速在线| 亚洲第一在线综合在线| 在线看片日韩| 久久青草福利网站| 欧美成人69av| 亚洲日本在线观看| 欧美二区在线| 亚洲精品黄色| 国产精品99久久久久久有的能看| 欧美久久久久久蜜桃| 亚洲日本成人| 亚洲一级高清| 国产精品黄色在线观看| 中文一区字幕| 久久超碰97中文字幕| 亚洲国产综合91精品麻豆| 亚洲激情图片小说视频| 欧美在线视频在线播放完整版免费观看| 亚洲欧美影院| 国产视频久久久久| 久热re这里精品视频在线6| 欧美高清在线观看| 一本久久综合亚洲鲁鲁五月天| 欧美精品一区在线发布| 一区二区电影免费观看| 亚洲欧美日韩专区| 国产一区二区成人| 免费h精品视频在线播放| 亚洲精品一区二区三区福利| 亚洲一区一卡| 狠狠色2019综合网| 欧美极品色图| 亚洲欧美国产视频| 男人的天堂成人在线| 一区二区毛片| 国产亚洲亚洲| 欧美精品成人一区二区在线观看| 一区二区91| 免费成人av在线看| 亚洲午夜精品国产| 韩国视频理论视频久久| 欧美激情国产日韩| 午夜影院日韩| 亚洲国产天堂网精品网站| 香蕉成人伊视频在线观看| 亚洲电影免费在线| 国产精品毛片在线| 欧美刺激午夜性久久久久久久| 亚洲网址在线| 亚洲国产99精品国自产| 欧美亚洲免费| 99在线视频精品| 伊人久久婷婷| 国产精品永久免费| 欧美精品手机在线| 久久亚洲精品网站| 性欧美xxxx大乳国产app| 亚洲久色影视| 欧美国产日韩一区| 久久久亚洲国产美女国产盗摄| 在线亚洲观看| 亚洲精品久久7777| 狠狠色狠狠色综合日日91app| 欧美日韩一区二区在线视频| 麻豆freexxxx性91精品| 午夜精品久久久久久久99热浪潮 | 中文无字幕一区二区三区| 欧美福利视频网站| 久久视频国产精品免费视频在线| 亚洲一级电影| 一本色道久久88精品综合| 在线观看亚洲精品视频| 国产偷久久久精品专区| 国产精品女主播一区二区三区| 欧美极品色图| 欧美—级高清免费播放| 欧美国产精品va在线观看| 久久综合九色综合欧美狠狠| 久久国产精品久久精品国产| 亚洲男人第一av网站| 亚洲视频免费在线| 亚洲午夜av电影| 亚洲调教视频在线观看| 亚洲四色影视在线观看| 一区二区三区日韩精品| 99视频精品| 宅男66日本亚洲欧美视频| 亚洲人成免费| 欧美日韩免费在线视频| 一区二区三区精品视频在线观看| 亚洲国产精选| 亚洲人成网站影音先锋播放| 亚洲电影av在线| 亚洲国产高潮在线观看| 亚洲国产精品ⅴa在线观看 | 美日韩精品免费| 免费观看日韩| 亚洲黄色精品| 日韩小视频在线观看专区| 99精品欧美一区二区三区| 亚洲色诱最新| 欧美一区二区黄色| 久久久欧美一区二区| 美女精品国产| 欧美色图首页| 国产婷婷一区二区| 亚洲国产精品福利| 亚洲少妇自拍| 久久国产视频网| 欧美激情精品久久久久久| 亚洲国产婷婷综合在线精品| 一区电影在线观看| 欧美在线亚洲一区| 欧美激情四色| 国产日本欧美在线观看| 亚洲黄色影院| 亚洲欧美日韩在线不卡| 美女诱惑一区| 99riav国产精品| 久久精品毛片| 欧美午夜精品久久久久久久| 国内精品视频久久| 亚洲私拍自拍| 免费成人黄色片| 亚洲五月六月| 欧美国产精品中文字幕| 国产欧美婷婷中文| 99视频+国产日韩欧美| 久久国产精彩视频| 日韩视频免费观看| 久久男女视频| 国产女人aaa级久久久级| 91久久嫩草影院一区二区| 亚洲男女毛片无遮挡| 亚洲第一主播视频| 久久爱另类一区二区小说| 欧美午夜在线观看| 亚洲日韩欧美一区二区在线| 欧美在线不卡视频| 99精品视频免费观看| 男女精品网站| 亚洲成人原创| 久久福利电影| 亚洲综合欧美|