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