有其他類的對象作為 成員對象的類叫封閉類。
任何生成封閉類對象的語句,都要讓編譯器明白,對象中的成員對象,是如何初始化的。
具體做法是通過封閉類的構(gòu)造函數(shù)的初始化列表。
封閉類對象生成時,先執(zhí)行所有對象成員的構(gòu)造函數(shù),然后才執(zhí)行封閉類的構(gòu)造函數(shù)。
對象成員的構(gòu)造函數(shù)調(diào)用次序和對象成員在類中的說明次序一致,與它們在成員初始化列表中的出現(xiàn)次序無關(guān)。
當封閉類對象消亡時,先執(zhí)行封閉類的析構(gòu)函數(shù),然后再執(zhí)行成員對象的析構(gòu)函數(shù)。次序和構(gòu)造函數(shù)的調(diào)用順序相反。其原因是如果封閉類帶的析構(gòu)函數(shù)中使用到了成員對象的內(nèi)容,那么先執(zhí)行成員對象的析構(gòu)函數(shù),就可能會導致封閉類的析構(gòu)函數(shù)在執(zhí)行時發(fā)生不可預估的錯誤。
封閉類構(gòu)造函數(shù)實例。
// ConsoleApplication3.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
#include "pch.h"
#include <iostream>
class Lun_zi
{
public:
Lun_zi(int k,int z);
~Lun_zi();
private:
int kuan;
int zhijing;
};
Lun_zi::Lun_zi(int k,int z)
{
kuan = k;
zhijing = z;
std::cout << "輪子1" << std::endl;
}
Lun_zi::~Lun_zi()
{
std::cout << "輪子2" << std::endl;
}
class yin_qing
{
public:
yin_qing();
~yin_qing();
private:
};
yin_qing::yin_qing()
{
std::cout << "引擎1" << std::endl;
}
yin_qing::~yin_qing()
{
std::cout << "引擎2" << std::endl;
}
class CAR
{
public:
CAR(int money,int k,int z);
~CAR();
private:
Lun_zi l_z;
yin_qing y_q;
int jia_ge;
};
CAR::CAR(int money, int k, int z):l_z