1. 程式人生 > >建構函式與解構函式的比較

建構函式與解構函式的比較

建構函式的作用:建立並初始化物件,即為物件成員變數賦初始值。
特點
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; }

結果:
這裡寫圖片描述