首頁 >後端開發 >C++ >C聚合中成員物件的初始化和銷毀順序是如何決定的?

C聚合中成員物件的初始化和銷毀順序是如何決定的?

Linda Hamilton
Linda Hamilton原創
2024-11-07 18:17:02681瀏覽

How is the initialization and destruction order of member objects in C   aggregates determined?

C 中的成員初始化和銷毀順序

在C 中,成員物件初始化和銷毀行為的順序對於理解行為至關重要的複雜資料結構。讓我們考慮以下程序:

#include <iostream>
using namespace std;

struct A
{
    A() { cout << "A::A" << endl; }
    ~A() { cout << "A::~" << endl; }
};

struct B
{
    B() { cout << "B::B" << endl; }
    ~B() { cout << "B::~" << endl; }
};

struct C
{
    C() { cout << "C::C" << endl; }
    ~C() { cout << "C::~" << endl; }
};

struct Aggregate
{
    A a;
    B b;
    C c;
};

int main()
{
    Aggregate a;
    return 0;
}

程式建立一個聚合結構體的實例,其中包含其他三個結構體 A、B 和 C。當我們執行程式時,會產生以下輸出:

A::A
B::B
C::C
C::~
B::~
A::~

這個輸出提出了一個問題:這個構造和銷毀的順序是否由 C 標準保證?

答案是 。依據C 標準(12.6.2),聚合結構體的成員依下列順序初始化與析構:

  • 初始化順序:

    • 首先,虛擬基底類別會依照它們在衍生類別宣告中出現的順序進行初始化。
    • 然後,直接基類會依照它們在基類列表中出現的順序進行初始化。
    • 最後,非靜態資料成員依照在類別定義中宣告的順序初始化。
  • 銷毀順序:

    • 非靜態資料成員依照它們初始化的相反順序被破壞。
    • 直接基類依照它們初始化的相反順序被破壞。
    • 虛擬基類是

因此,對於給定的程序,成員構造和銷毀的順序保證為:

  1. 初始化:A::A、B::B、C::C
  2. 銷毀:C::~、B::~、A::~

這個保證在C 中建立和銷毀複雜資料結構時行為一致。

以上是C聚合中成員物件的初始化和銷毀順序是如何決定的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn