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