溫馨提示×

C++構(gòu)造函數(shù)有何執(zhí)行順序

c++
小樊
81
2024-11-09 00:35:28
欄目: 編程語言

C++構(gòu)造函數(shù)的執(zhí)行順序遵循以下規(guī)則:

  1. 基類構(gòu)造函數(shù):首先調(diào)用基類的構(gòu)造函數(shù)。如果基類沒有默認(rèn)構(gòu)造函數(shù)(無參數(shù)的構(gòu)造函數(shù)),則需要顯式地調(diào)用一個(gè)帶參數(shù)的基類構(gòu)造函數(shù)。

  2. 成員變量初始化列表:在基類構(gòu)造函數(shù)調(diào)用之后,構(gòu)造函數(shù)將按照成員變量在類定義中的聲明順序初始化類的成員變量??梢允褂贸蓡T初始化列表來初始化成員變量,這樣可以提供更好的性能,并允許對常量和引用類型的成員變量進(jìn)行初始化。

  3. 構(gòu)造函數(shù)體:最后執(zhí)行構(gòu)造函數(shù)的函數(shù)體。在這個(gè)階段,可以執(zhí)行一些額外的操作,比如分配內(nèi)存、初始化指針等。

  4. 析構(gòu)函數(shù):當(dāng)構(gòu)造函數(shù)執(zhí)行完畢后,對象的析構(gòu)函數(shù)將按照相反的順序被調(diào)用。首先調(diào)用派生類的析構(gòu)函數(shù),然后是基類的析構(gòu)函數(shù)。這是為了確保在對象銷毀之前,所有資源都被正確地釋放。

以下是一個(gè)簡單的例子,展示了構(gòu)造函數(shù)的執(zhí)行順序:

#include <iostream>

class Base {
public:
    Base(int x) : a(x) {
        std::cout << "Base constructor called with value: "<< a << std::endl;
    }

    ~Base() {
        std::cout << "Base destructor called" << std::endl;
    }

private:
    int a;
};

class Derived : public Base {
public:
    Derived(int x, int y) : Base(x), b(y) {
        std::cout << "Derived constructor called with values: "<< a << ", "<< b << std::endl;
    }

    ~Derived() {
        std::cout << "Derived destructor called" << std::endl;
    }

private:
    int b;
};

int main() {
    Derived d(1, 2);
    return 0;
}

輸出結(jié)果:

Base constructor called with value: 1
Derived constructor called with values: 1, 2
Derived destructor called
Base destructor called

在這個(gè)例子中,首先調(diào)用基類Base的構(gòu)造函數(shù),然后是派生類Derived的構(gòu)造函數(shù)。當(dāng)對象d被銷毀時(shí),析構(gòu)函數(shù)的調(diào)用順序是相反的,首先是派生類的析構(gòu)函數(shù),然后是基類的析構(gòu)函數(shù)。

0