建構函式與解構函式的比較
建構函式的作用:建立並初始化物件,即為物件成員變數賦初始值。
特點:
1、建構函式名與類名相同。
2、建構函式沒有返回值。
3、建構函式不可以被直接呼叫。
4、定義了類沒有定義建構函式時C++會提供預設建構函式,預設建構函式是無參建構函式,僅負責建立物件。
5、一個類可以有多個建構函式。
6、建構函式不可以是虛擬函式。原因:虛擬函式通過基類指標或引用來呼叫派生類的成員,呼叫前物件必須存在,然而建構函式就是用來建立物件的。
解構函式的作用:銷燬物件。
特點:
1、解構函式名與類名同名,但須在函式名前加~。
2、解構函式無返回值。
3、解構函式無引數。
4、一個類只能有一個解構函式。
5、解構函式不能過載。
6、如果使用者沒有編寫解構函式,C++會自動提供一個預設的解構函式,這個解構函式不進行任何操作。
7、基類的解構函式常常是虛解構函式。原因
8、解構函式預設不是虛擬函式。
建構函式與解構函式的呼叫時機
建構函式和解構函式的呼叫都是自動的。建立物件時呼叫建構函式,銷燬物件時呼叫解構函式。
全域性物件的建構函式在main函式之前呼叫,解構函式在main函式執行結束之後呼叫。不同全域性變數的建構函式的執行順序與變數定義的順序一致,而解構函式的呼叫順序正好相反。
區域性變數的建構函式在程式執行到定義區域性變數的語句時呼叫,在退出包含定義區域性變數的語句的塊時呼叫解構函式。不同區域性變數的建構函式的執行順序與變數定義的順序一致,而解構函式的呼叫順序正好相反。
靜態區域性變數的建構函式在程式第一次執行,到定義靜態區域性變數的語句時呼叫,而解構函式在main函式執行結束之後呼叫,不同靜態區域性變數的建構函式的執行順序與變數定義的順序一致,而解構函式的呼叫順序正好相反。
建構函式與解構函式的執行順序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
}
~Base()
{
cout << "~Base()" << endl;
}
};
class Base1:public Base
{
public:
Base1()
{
cout << "Base1()" << endl;
}
~Base1()
{
cout << "~Base1()" << endl;
}
};
class Base2 :public Base
{
public:
Base2()
{
cout << "Base2()" << endl;
}
~Base2()
{
cout << "~Base2()" << endl;
}
};
class Base3 :public Base1,Base2
{
public:
Base3()
{
cout << "Base3()"<<"\n" << endl;
}
~Base3()
{
cout <<"\n"<< "~Base3()" << endl;
}
};
void test()
{
Base3 b;
}
int main()
{
test();
system("pause");
return 0;
}
結果: