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 }
執(zhí)行一下這段代碼,打印出了兩個不同的對象地址,因為不帶參數(shù)的構(gòu)造函數(shù)實現(xiàn)里去調(diào)用帶參數(shù)的構(gòu)造函數(shù)時,并沒有完成對象內(nèi)部的函數(shù)調(diào)用,而是優(yōu)先選擇了通過帶參數(shù)構(gòu)造函數(shù)又構(gòu)造出了一個新的對象。
所以在實際應(yīng)用中,我們應(yīng)該:
1. 我們要盡量避免構(gòu)造函數(shù)間的調(diào)用;
2. 有人習(xí)慣在默認(rèn)構(gòu)造里對成員進行初始化,帶參構(gòu)造里進行賦值或更為復(fù)雜的處理,但實際各個構(gòu)造函數(shù)的關(guān)系應(yīng)該并列,我們應(yīng)該在每個構(gòu)造函數(shù)里都做成員初始化的操作,或者把成員初始化和每個構(gòu)造函數(shù)要進行的同樣的操作封裝為一個類的私有成員函數(shù),在每個構(gòu)造函數(shù)里調(diào)用該成員函數(shù);
3. 如果實在避免不了構(gòu)造函數(shù)之間的調(diào)用,那就只能用必殺了,采用new的方式,即上面的代碼20行改為new (this)Test(0),使構(gòu)造函數(shù)在已經(jīng)分配好的內(nèi)存上執(zhí)行,而不是重新分配新的內(nèi)存;