多個對象構造和析構
1對象初始化列表
1)對象初始化列表出現原因
1.必須這樣做:
如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的構造函數,沒有默認構造函數。這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的構造函數,
如果沒有初始化列表,那么他將無法完成第一步,就會報錯。
2、類成員中若有const修飾,必須在對象初始化的時候,給const int m 賦值
當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化,
因為這兩種對象要在聲明后馬上初始化,而在構造函數中,做的是對他們的賦值,這樣是不被允許的。
2)C++中提供初始化列表對成員變量進行初始化
語法規則
Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
{
// some other assignment operation
}
3)注意概念
初始化:被初始化的對象正在創建
賦值:被賦值的對象已經存在
4)注意:
成員變量的初始化順序與聲明的順序相關,與在初始化列表中的順序無關
初始化列表先於構造函數的函數體執行
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A(int _a) 8 { 9 a = _a; 10 cout << "構造函數" << "a" << a << endl; 11 } 12 13 ~A() 14 { 15 cout << "析構函數" << "a" << a << endl; 16 } 17 18 protected: 19 private: 20 int a; 21 }; 22 23 24 //1 構造函數的初始化列表 解決: 在B類中 組合了一個 A類對象 (A類設計了構造函數) 25 //根據構造函數的調用規則 設計A的構造函數, 必須要用;沒有機會初始化A 26 //新的語法 Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3) 27 class B 28 { 29 public: 30 B(int _b1, int _b2) : a1(1), a2(2), c(0) 31 { 32 33 } 34 35 B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0) 36 { 37 b1 = _b1; 38 b2 = _b2; 39 cout <<"B的構造函數"<<endl; 40 } 41 ~B() 42 { 43 cout<<"B的析構函數" <<endl; 44 } 45 46 protected: 47 private: 48 int b1; 49 int b2; 50 A a2; 51 A a1; 52 const int c; 53 }; 54 55 56 //2 先執行 被組合對象的構造函數 57 //如果組合對象有多個,按照定義順序, 而不是按照初始化列表的順序 58 59 //析構函數 : 和構造函數的調用順序相反 60 61 //3 被組合對象的構造順序 與定義順序有關系 ,與初始化列表的順序沒有關系. 62 //4 初始化列表 用來 給const 屬性賦值 63 void obj10play() 64 { 65 66 //A a1(10); 67 //B ojbB(1, 2); 68 69 //1參數傳遞 70 B ojbB2(1, 2,3, 4); 71 72 //2 調用順序 73 74 return ; 75 } 76 77 void main100() 78 { 79 obj10play(); 80 system("pause"); 81 }