• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            在構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)的誤解

            在構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)

            作者:panic 2005年6月9

            構(gòu)造函數(shù)的調(diào)用一定會產(chǎn)生對象,而不是通常中的函數(shù)調(diào)用

            源自VCKBASE的一個帖子。
            首先明確一點(diǎn):直接調(diào)用構(gòu)造函數(shù),只有一個作用,就是在棧上構(gòu)造一個臨時對象。
            所以構(gòu)造函數(shù)的互相調(diào)用引起的后果不是死循環(huán),而是棧溢出。

            理論上,不允許在某個構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù)。除非有特別的功能需求。

            假設(shè)一個類
            class A
            {
            public:
                A();
                A(int i);
                ~A();
            }

            假設(shè)實(shí)現(xiàn)是這樣的:
            A::A()
            {
                A(0); //
            注意
            }

            A::A(int i)
            {
            }

            A::~A()
            {
            }

            //注意 處的代碼,其實(shí)執(zhí)行了這樣的操作:
            在棧上開辟空間,構(gòu)造一個A的實(shí)例。
            然后對象被釋放,這個釋放有可能在函數(shù)結(jié)束前就進(jìn)行了。

            最終跟蹤到的結(jié)果是這樣:
            A()
            被調(diào)用
            A(int i)
            被調(diào)用
            ~A()
            被調(diào)用
            //.....

            上面那個~A()讓很多人迷惑,其實(shí)這只是那個臨時對象釋放而已。

            這個臨時對象,在大多數(shù)場合不產(chǎn)生任何有功能的影響力。

            這種調(diào)用,往往被很多人誤解,以為可以通過構(gòu)造函數(shù)的重載和相互調(diào)用實(shí)現(xiàn)一些類似默認(rèn)參數(shù)的功能,其實(shí)是不行的,而且往往有副作用

            而同一個類的構(gòu)造函數(shù)又不能寫在初始化成員列表里面,那怎么樣才能實(shí)現(xiàn)這種需求呢?

            偶只知道一個方法:
            額外增加一個Init函數(shù),在不同的構(gòu)造函數(shù)中用不同的參數(shù)調(diào)用這個函數(shù)即可。

            雖然不夠優(yōu)雅,但是勉強(qiáng)夠用了。

             

            Feedback

            # 回去想了一下,差不多明白了,不過還是恐慌兄快呀,;P

            2005-06-10 09:16 by 笑柄

            A::A()
            {
                A(0); //
            注意
               //
            這個地方構(gòu)造了一個對象,由于沒有人接收該對象,即該對象為該函數(shù)的局部變量,則離開該函數(shù)域則銷毀,故析構(gòu)是必然的
            }

            # LOOK THIS!!!use placehold constructor

            2005-06-10 11:00 by X

            class A
            {
            public:
            A();
            A(int i);
            ~A();
            }


            A::A()
            {
            new(this)A(0);
            }

            A::A(int i)
            {
            }

            A::~A()
            {
            }

            # another way is ->

            2005-06-10 11:06 by E

            A::A()
            {
            *this=A(0);
            }

            but not efficiency

            referring to :
            http://blog.vckbase.com/bastet/archive/2005/03/03/3370.html

            # 成員初始化列表

            2005-06-11 21:14 by 清風(fēng)雨

            如題!

            這個是C++,不是java,所以C++兄弟要小心一點(diǎn)。(開始自己也以為類似,可以的)

             

             

            posted on 2009-09-15 12:17 肥仔 閱讀(388) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            久久精品国产只有精品66| 99久久精品国内| 综合久久精品色| 久久精品国产亚洲精品2020| 99精品国产在热久久无毒不卡| 97超级碰碰碰碰久久久久| 亚洲午夜无码久久久久小说| 人妻少妇久久中文字幕 | 亚洲国产成人乱码精品女人久久久不卡 | 久久激情五月丁香伊人| 偷窥少妇久久久久久久久| 粉嫩小泬无遮挡久久久久久 | 久久综合亚洲色HEZYO社区| 99久久婷婷国产综合亚洲| 亚洲精品99久久久久中文字幕 | 久久久无码精品亚洲日韩蜜臀浪潮| 久久精品人人做人人爽电影| 久久久无码精品亚洲日韩京东传媒| 久久免费视频网站| 色综合久久久久久久久五月| 亚洲国产成人久久综合一区77| 97久久精品国产精品青草| 午夜不卡久久精品无码免费| 色婷婷综合久久久久中文字幕| 久久精品这里热有精品| 国产精品久久久久久吹潮| 中文字幕热久久久久久久| 久久久久人妻精品一区三寸蜜桃| 久久久久中文字幕| 狠狠干狠狠久久| 91久久精品无码一区二区毛片| 日韩精品久久久肉伦网站| 日韩精品无码久久久久久| 亚洲欧美日韩久久精品第一区| 99久久免费国产精品特黄| 久久无码AV中文出轨人妻| 色播久久人人爽人人爽人人片aV | 久久精品嫩草影院| 国产精品成人无码久久久久久 | 国产精品久久婷婷六月丁香| 亚洲欧美日韩久久精品|