1 #include <iostream>
2
3 using namespace std;
4
5 class Test
6 {
7 public:
8 int _mX;
9 int _mY;
10
11 Test(int n)
12 {
13 _mX = n;
14 cout << this << endl;
15 }
16
17 Test()
18 {
19 cout << this << endl;
20 Test(0);
21 }
22 };
23
24 int main()
25 {
26 Test test;
27
28 return 0;
29 }
执行一下这段代码,打印出了两个不同的对象地址,因为不带参数的构造函数实现里去调用带参数的构造函数时,并没有完成对象内部的函数调用,而是优先选择了通过带参数构造函数又构造出了一个新的对象。
所以在实际应用中,我们应该:
1. 我们要尽量避免构造函数间的调用;
2. 有人习惯在默认构造里对成员进行初始化,带参构造里进行赋值或更为复杂的处理,但实际各个构造函数的关系应该并列,我们应该在每个构造函数里都做成员初始化的操作,或者把成员初始化和每个构造函数要进行的同样的操作封装为一个类的私有成员函数,在每个构造函数里调用该成员函数;
3. 如果实在避免不了构造函数之间的调用,那就只能用必杀了,采用new的方式,即上面的代码20行改为new (this)Test(0),使构造函数在已经分配好的内存上执行,而不是重新分配新的内存;