首页 > 编程语言 > 详细

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

时间:2016-03-03 21:00:35      阅读:245      评论:0      收藏:0      [点我收藏+]
 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; }

 

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

原文:http://www.cnblogs.com/crazyhenry/p/5239794.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!