程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【C++學習之路】組合類的構造函數,之路構造函數

【C++學習之路】組合類的構造函數,之路構造函數

編輯:C++入門知識

【C++學習之路】組合類的構造函數,之路構造函數


 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 }

 

造函數的調用順序為:(1)按內嵌對象在組合類內的聲明順序先後調用 相應對象的相應的類的構造函數(不是初始化列表的順序) (2)執行該組合類的相應構造函數(函數體)

 

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved