今天在測試一個構造函數和析構函數的用例的時候,發現我們所鐘愛的VC6.0實在是Bug問題越來越多,對于學習C++的新手來講,有必要在這里給大家說明一下。
構造函數順序為:
-
?全局對象的構造函數;
-
?main函數中對象的構造函數,包括automatic、static依次調用;
-
?main中遇到函數中有局部對象時,進入到函數中調用局部對象的構造函數。
???? 注:static對象的構造函數永遠只調用一次。
析構函數順序為:
-
退出函數時,執行函數內構造的automatic對象的析構函數,注:static對象不析構;
-
main函數中按構造的逆序析構automatic對象;
-
調用函數中定義的static對象的析構函數;
-
調用main中定義的static對象的析構函數;
-
最后調用全局對象的析構函數。
注:復合中的構造、析構順序
???? 構造:按聲明對象的順序來構造成員對象,而不是按照構造函數成員初始值列表中列出的順序;而且在包含它們的類對象(宿主對象)被構造之前構造。即:由內向外構造。
??? 析構:按對象構造的逆序析構。對于復合對象,先析構主對象,再析構其包含的對象。
比如有以下的測試用例:
//#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。