1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){ cout << "調用A無參" << endl; } 7 A(int a){ dataA = a; cout << "調用A有參" << endl; } 8 A(double a){ dataA = a; cout << "調用A有參2" << endl; } 9 private: 10 int dataA; 11 }; 12 class B 13 { 14 public: 15 B(); 16 B(int, int, int); 17 B(int); 18 B(int, int); 19 B(double); 20 private: 21 A a1, a2; 22 int dataB; 23 }; 24 B::B(){ cout << "調用B無參" << endl; } 25 B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "調用B有參1" << endl; } 26 B::B(int a){ dataB = a; cout << "調用B有參2" << endl; } 27 B::B(int a, int b) :a2(a),dataB(b) { cout << "調用B有參3" << endl; } 28 B::B(double a) : a2(a){ cout << "調用B有參4" << endl; } 29 void main() 30 { 31 B b1; 32 B b2(1, 2, 3); 33 B b3(4); 34 B b4(5, 6); 35 B b5(7.0); 36 }
2.在內嵌對象的初始化列表中如果沒有寫明對象的初始化列表,系統會自動生成一個無參構造函數,這時如果在該內嵌對象對應的類中沒有定義(注意,不是沒有顯式聲明,有時系統會自動生成默認的構造函數,這當然也是一種無參構造函數)無參構造函數,系統會報錯
27 B::B(int a, int b) :a2(a),dataB(b) { cout << "調用B有參3" << endl; }
比如這條語句,a1的初始化列表沒有顯式表示,這時系統會調一個a1對應的無參構造函數,而實際的調用順序應該是這樣的:
27 B::B(int a, int b) :a1(),a2(a),dataB(b) { cout << "調用B有參3" << endl; }
3.這條語句:
B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "調用B有參1" << endl; }3.1正確的調用順序:先a1的構造,再a2的構造,最後才是dataB的初始化。 3.2同時這條語句的寫法有多種: A.把組合類的構造放在裡面
B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "調用B有參1" << endl; }B.把組合類的構造放在外邊,同時不需要考慮dataB的調用順序,一定是最後調用
B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "調用B有參1" << endl; }
4.在類的函數聲明的時候,完全可以暫時不寫出形參,等到定義的時候再寫 聲明:
B(); B(int, int, int); B(int); B(int, int); B(double);定義:
B::B(){ cout << "調用B無參" << endl; } B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "調用B有參1" << endl; } B::B(int a){ dataB = a; cout << "調用B有參2" << endl; } B::B(int a, int b) : a2(a),dataB(b) { cout << "調用B有參3" << endl; } B::B(double a) : a2(a){ cout << "調用B有參4" << endl; }