今天在測(cè)試一個(gè)構(gòu)造函數(shù)和析構(gòu)函數(shù)的用例的時(shí)候,發(fā)現(xiàn)我們所鐘愛的VC6.0實(shí)在是Bug問題越來越多,對(duì)于學(xué)習(xí)C++的新手來講,有必要在這里給大家說明一下。
構(gòu)造函數(shù)順序?yàn)椋?/p>
-
?全局對(duì)象的構(gòu)造函數(shù);
-
?main函數(shù)中對(duì)象的構(gòu)造函數(shù),包括automatic、static依次調(diào)用;
-
?main中遇到函數(shù)中有局部對(duì)象時(shí),進(jìn)入到函數(shù)中調(diào)用局部對(duì)象的構(gòu)造函數(shù)。
???? 注:static對(duì)象的構(gòu)造函數(shù)永遠(yuǎn)只調(diào)用一次。
析構(gòu)函數(shù)順序?yàn)椋?/p>
-
退出函數(shù)時(shí),執(zhí)行函數(shù)內(nèi)構(gòu)造的automatic對(duì)象的析構(gòu)函數(shù),注:static對(duì)象不析構(gòu);
-
main函數(shù)中按構(gòu)造的逆序析構(gòu)automatic對(duì)象;
-
調(diào)用函數(shù)中定義的static對(duì)象的析構(gòu)函數(shù);
-
調(diào)用main中定義的static對(duì)象的析構(gòu)函數(shù);
-
最后調(diào)用全局對(duì)象的析構(gòu)函數(shù)。
注:復(fù)合中的構(gòu)造、析構(gòu)順序
???? 構(gòu)造:按聲明對(duì)象的順序來構(gòu)造成員對(duì)象,而不是按照構(gòu)造函數(shù)成員初始值列表中列出的順序;而且在包含它們的類對(duì)象(宿主對(duì)象)被構(gòu)造之前構(gòu)造。即:由內(nèi)向外構(gòu)造。
??? 析構(gòu):按對(duì)象構(gòu)造的逆序析構(gòu)。對(duì)于復(fù)合對(duì)象,先析構(gòu)主對(duì)象,再析構(gòu)其包含的對(duì)象。
比如有以下的測(cè)試用例:
//#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);
?
}
程序執(zhí)行的時(shí)候,在VC6 withSp6下運(yùn)行的結(jié)果
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>的時(shí)候才有此句輸出
??????? 其中包含有注釋的部分,為調(diào)整包含的頭文件為<iostream.h>的情況下才有的輸出。如果使用 命名空間的std的話,沒有最后的一句輸出。
????????從百度上找了半天,才發(fā)現(xiàn)不是沒有調(diào)用全局變量的析構(gòu)函數(shù),而是因?yàn)槲覀兯玫木幾g器有問題,這是MS的產(chǎn)品對(duì)于C++的支持做的不是盡善盡美,有網(wǎng)友說在Vc7.0中好想消除了這個(gè)Bug。