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

            旅途

            如果想飛得高,就該把地平線忘掉

            C++構造函數與析構函數執行順序 ???

            今天在測試一個構造函數和析構函數的用例的時候,發現我們所鐘愛的VC6.0實在是Bug問題越來越多,對于學習C++的新手來講,有必要在這里給大家說明一下。

            構造函數順序為:

            1. ?全局對象的構造函數;
            2. ?main函數中對象的構造函數,包括automatic、static依次調用;
            3. ?main中遇到函數中有局部對象時,進入到函數中調用局部對象的構造函數。

            ???? 注:static對象的構造函數永遠只調用一次。

            析構函數順序為:

            1. 退出函數時,執行函數內構造的automatic對象的析構函數,注:static對象不析構;
            2. main函數中按構造的逆序析構automatic對象;
            3. 調用函數中定義的static對象的析構函數;
            4. 調用main中定義的static對象的析構函數;
            5. 最后調用全局對象的析構函數。

            注:復合中的構造、析構順序

            ???? 構造:按聲明對象的順序來構造成員對象,而不是按照構造函數成員初始值列表中列出的順序;而且在包含它們的類對象(宿主對象)被構造之前構造。即:由內向外構造。

            ??? 析構:按對象構造的逆序析構。對于復合對象,先析構主對象,再析構其包含的對象。

            比如有以下的測試用例:
            //#i nclude <iostream.h>
            #i nclude <iostream>
            using namespace std;
            class Demo {
            ?int id;
            public:?
            ?Demo(int i) ?
            ?{?id = i;
            ?cout << "id=" << id << ",Con" << endl; }
            ?~Demo()
            ?{ cout << "id=" << id << ",Des" <<endl; }
            };
            Demo d1(4);
            void fun(Demo d) {
            ?static Demo d2(2);
            ?Demo d3(3);
            ?cout << "fun" << endl;?
            }
            void main ()? {
            ?cout <<"main"<< endl;
            ?fun(d1);
            ?cout << "endmain" << endl;
            ?fun(d1);
            ?Demo * p = new Demo(8);
            ?
            }

            程序執行的時候,在VC6 withSp6下運行的結果

            id=4,Con

            main

            id=2,Con

            id=3,Con

            fun

            id=3,Des

            id=4,Des

            endmain

            id=3,Con

            fun

            id=3,Des

            id=4,Des

            id=8,Con

            id=2,Des
            //id=4,Des //在用<iostream.h>的時候才有此句輸出
            ??????? 其中包含有注釋的部分,為調整包含的頭文件為<iostream.h>的情況下才有的輸出。如果使用 命名空間的std的話,沒有最后的一句輸出。
            ????????從百度上找了半天,才發現不是沒有調用全局變量的析構函數,而是因為我們所用的編譯器有問題,這是MS的產品對于C++的支持做的不是盡善盡美,有網友說在Vc7.0中好想消除了這個Bug。

            posted on 2007-10-29 02:31 旅途 閱讀(1257) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            国产韩国精品一区二区三区久久| 精品国产91久久久久久久a| 亚洲日本va午夜中文字幕久久| 中文字幕精品无码久久久久久3D日动漫| 久久久久亚洲精品男人的天堂| 久久精品卫校国产小美女| 97久久精品人妻人人搡人人玩| 国产精品美女久久久久AV福利| 久久SE精品一区二区| 国产福利电影一区二区三区久久久久成人精品综合 | 97精品伊人久久大香线蕉app| 九九久久99综合一区二区| 欧美久久久久久精选9999| 久久亚洲精品成人av无码网站| 久久国产精品国语对白| 久久av无码专区亚洲av桃花岛| 久久国产视屏| 88久久精品无码一区二区毛片| 久久九九久精品国产免费直播| 久久久久一本毛久久久| 色综合久久最新中文字幕| 午夜天堂av天堂久久久| 伊人久久成人成综合网222| 久久精品免费网站网| 99久久精品国产一区二区三区 | 久久综合精品国产二区无码| 久久久久久国产a免费观看不卡| 国产产无码乱码精品久久鸭| 久久国产欧美日韩精品| 国产精品中文久久久久久久| 香蕉aa三级久久毛片| 伊人伊成久久人综合网777| 欧美日韩精品久久久久| 亚洲第一永久AV网站久久精品男人的天堂AV| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久精品国产AV一区二区三区| 久久亚洲日韩看片无码| 久久人人爽人人爽人人片av麻烦| 色综合久久夜色精品国产| 区久久AAA片69亚洲| 性欧美大战久久久久久久久 |