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),使構造函數在已經分配好的內存上執行,而不是重新分配新的內存;