【C++学习之路】组合类的构造函数

来源:互联网 发布:网线转换器选择 知乎 编辑:程序博客网 时间:2024/06/14 16:19


#include <iostream>using namespace std;class A{public:A(){ cout << "调用A无参" << endl; }A(int a){ dataA = a; cout << "调用A有参" << endl; }A(double a){ dataA = a; cout << "调用A有参2" << endl; }private:int dataA;};class B{public:B();B(int, int, int);B(int);B(int, int); B(double);private:A a1, a2;int dataB; };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; }void main(){B b1;B b2(1, 2, 3);B b3(4);B b4(5, 6);B b5(7.0);}

代码总结:

1.可以发现,在创建组合类的对象的时候,构造函数的调用顺序为:(1)按内嵌对象在组合类内的声明顺序先后调用 相应对象的相应的类的构造函数(不是初始化列表的顺序) (2)执行该组合类的相应构造函数(函数体)


2.在内嵌对象的初始化列表中如果没有写明对象的初始化列表,系统会自动生成一个无参构造函数,这时如果在该内嵌对象对应的类中没有定义(注意,不是没有显式声明,有时系统会自动生成默认的构造函数,这当然也是一种无参构造函数)无参构造函数,系统会报错

B::B(int a, int b) : a2(a),dataB(b) { cout << "调用B有参3" << endl; }
比如这条语句,a1的初始化列表没有显式表示,这时系统会调一个a1对应的无参构造函数,而实际的调用顺序应该是这样的:

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

2.1正确的调用顺序:先a1的构造,再a2的构造,最后才是dataB的初始化。
2.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; }

0 0
原创粉丝点击