【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.可以发现,在创建组合类的对象的时候,构造函数的调用顺序为:(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; }

 

posted @ 2016-03-03 19:30  CRAZY_HENRY  阅读(6596)  评论(0编辑  收藏  举报