Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah piawaian C menjamin susunan pembina ahli dan panggilan pemusnah dalam kelas dengan pembolehubah ahli kelas lain?

Bagaimanakah piawaian C menjamin susunan pembina ahli dan panggilan pemusnah dalam kelas dengan pembolehubah ahli kelas lain?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-08 06:31:02468semak imbas

How does the C   standard guarantee the order of member constructor and destructor calls in a class with member variables of other classes?

Tertib Panggilan Pembina dan Pemusnah Ahli

Masalah:

Dalam C , apabila kelas mengandungi pembolehubah ahli yang lain kelas, susunan permulaan dan pemusnahannya adalah penting. Pertimbangkan program berikut:

#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;
}

Di bawah piawaian C, adakah program ini dijamin sentiasa menghasilkan output berikut:

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

Jawapan:

Ya, ia dijamin.

Menurut seksyen 12.6.2 standard C, permulaan dan pemusnahan ahli dalam kelas mengikut peraturan tertentu:

Perintah Permulaan

  • Kelas asas maya (jika ada) dimulakan dahulu, kedalaman -pertama, kiri-ke-kanan.
  • Kelas asas langsung dimulakan seterusnya, dalam pengisytiharan tertib.
  • Ahli data bukan statik dimulakan dalam susunan pengisytiharan, tanpa mengira susunan permulaan ahli.
  • Badan pembina dilaksanakan terakhir.

Pemusnahan Perintah

  • Pernyataan kompaun badan pemusnah dilaksanakan pertama.
  • Ahli data bukan statik dimusnahkan dalam urutan perisytiharan terbalik.
  • Kelas asas langsung dimusnahkan dalam susunan pengisytiharan.
  • Kelas asas maya (jika ada) dimusnahkan terakhir, dalam kedalaman songsang-dahulu, kiri-ke-kanan perintah.

Dalam contoh yang disediakan, ahli struct Agregat diisytiharkan dalam susunan a, b dan c. Oleh itu, ia dijamin bahawa ia akan dimulakan dalam susunan A::A, B::B, dan C::C dan dimusnahkan dalam susunan terbalik C::~, B::~, dan A::~.

Atas ialah kandungan terperinci Bagaimanakah piawaian C menjamin susunan pembina ahli dan panggilan pemusnah dalam kelas dengan pembolehubah ahli kelas lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn