講講c++ Session 5:成員對象(Member objects)和封閉類(Enclosing class)
成員對象: 一個類的成員變量是另一個類的對象
封閉類:包含成員對象的類
舉個栗子:
class Tyre {
private:
int radius;
int width;
public:
Tyre(int r, int w):radius(r), width(w) { }
};
class Engine {
};
class Car {
// 這個類就是所謂的封閉類
//其中包括成員對象Engine和Tyre
private:
int price;
Tyre tyre;
Engine engine;
public:
Car(int p, int tr, int tw);
};
Car::Car(int p, int tr, int w):price(p), tyre(tr, w){
};
int main(){
Car car(20000,17,225);
return 0;
}
規范:
1、出現成員對象時,該類的構造函數要包含對成員的初始化。如果構造函數的成員初始化列表沒有對成員對象初始化時,則使用成員對象的缺省構造函數。
2、建立一個類的對象時,應先調用其構造函數。但是如果這個類有成員對象,則要先執行成員對象自己所屬類的構造函數,當全部成員對象都執行了自身類的構造函數後,再執行當前類的構造函數。
例如:
class Tyre {
public:
Tyre() { cout << "Tyre contructor" << endl; }
~Tyre() { cout << "Tyre destructor" << endl; }
};
class Engine {
public:
Engine() { cout << "Engine contructor" << endl; }
~Engine() { cout << "Engine destructor" << endl; }
};
7
class CCar {
private:
Engine engine;
Tyre tyre;
public:
Car( ) { cout << “Car contructor” << endl; }
~Car() { cout << "Car destructor" << endl; }
};
int main(){
Car car;
return 0;
}
其輸出為:
Engine contructor
Tyre contructor
Car contructor
Car destructor
Tyre destructor
Engine destructor
根據規范可知,調用順序和編譯器順序是不一樣的,因此輸出也不同。
【參考Tips】
#include
using namespace std;
class Date
{
public:
Date( ){ cout<<"This is Date"<