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

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

            在構造函數中調用構造函數的誤解

            在構造函數中調用構造函數

            作者:panic 2005年6月9

            構造函數的調用一定會產生對象,而不是通常中的函數調用

            源自VCKBASE的一個帖子。
            首先明確一點:直接調用構造函數,只有一個作用,就是在棧上構造一個臨時對象。
            所以構造函數的互相調用引起的后果不是死循環,而是棧溢出。

            理論上,不允許在某個構造函數中調用其他構造函數。除非有特別的功能需求。

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

            假設實現是這樣的:
            A::A()
            {
                A(0); //
            注意
            }

            A::A(int i)
            {
            }

            A::~A()
            {
            }

            //注意 處的代碼,其實執行了這樣的操作:
            在棧上開辟空間,構造一個A的實例。
            然后對象被釋放,這個釋放有可能在函數結束前就進行了。

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

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

            這個臨時對象,在大多數場合不產生任何有功能的影響力。

            這種調用,往往被很多人誤解,以為可以通過構造函數的重載和相互調用實現一些類似默認參數的功能,其實是不行的,而且往往有副作用。

            而同一個類的構造函數又不能寫在初始化成員列表里面,那怎么樣才能實現這種需求呢?

            偶只知道一個方法:
            額外增加一個Init函數,在不同的構造函數中用不同的參數調用這個函數即可。

            雖然不夠優雅,但是勉強夠用了。

             

            Feedback

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

            2005-06-10 09:16 by 笑柄

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

            # 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 清風雨

            如題!

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

             

             

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

            亚洲国产成人久久精品99 | 久久精品国产精品亚洲精品 | 久久亚洲AV无码精品色午夜麻豆| 久久精品国产一区二区电影| 噜噜噜色噜噜噜久久| 国产亚洲美女精品久久久2020| 久久精品国产亚洲av日韩| 久久电影网| 久久久久久综合一区中文字幕| 欧美亚洲日本久久精品| 国产精品久久久久9999| 一本一道久久a久久精品综合 | 久久精品一区二区影院| 99久久国产综合精品女同图片| 久久国产乱子伦精品免费强| 久久精品卫校国产小美女| 91精品国产91久久久久久青草| 亚洲精品无码久久久久sm| 欧美久久综合九色综合| 日本精品久久久久中文字幕8| 久久天天躁夜夜躁狠狠| 久久天天日天天操综合伊人av| 91久久精一区二区三区大全| 久久中文字幕精品| 久久人搡人人玩人妻精品首页| 亚洲国产精品久久久久婷婷老年| 久久影院综合精品| 国产成人精品三上悠亚久久| 伊人久久大香线蕉无码麻豆| 国产福利电影一区二区三区久久老子无码午夜伦不| 久久综合成人网| 午夜精品久久久久成人| 91久久精品视频| 很黄很污的网站久久mimi色 | 久久WWW免费人成—看片| 久久久久人妻一区精品色| 亚洲国产日韩欧美综合久久| 久久国产成人午夜aⅴ影院| 久久99热这里只有精品国产| 国产精品午夜久久| 久久久久久毛片免费看|