在構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)
作者:panic 2005年6月9日
構(gòu)造函數(shù)的調(diào)用一定會產(chǎn)生對象,而不是通常中的函數(shù)調(diào)用
源自VCKBASE的一個帖子。
首先明確一點:直接調(diào)用構(gòu)造函數(shù),只有一個作用,就是在棧上構(gòu)造一個臨時對象。
所以構(gòu)造函數(shù)的互相調(diào)用引起的后果不是死循環(huán),而是棧溢出。
理論上,不允許在某個構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù)。除非有特別的功能需求。
假設(shè)一個類
class A
{
public:
A();
A(int i);
~A();
}
假設(shè)實現(xiàn)是這樣的:
A::A()
{
A(0); //注意
}
A::A(int i)
{
}
A::~A()
{
}
在 //注意 處的代碼,其實執(zhí)行了這樣的操作:
在棧上開辟空間,構(gòu)造一個A的實例。
然后對象被釋放,這個釋放有可能在函數(shù)結(jié)束前就進行了。
最終跟蹤到的結(jié)果是這樣:
A()被調(diào)用
A(int i)被調(diào)用
~A()被調(diào)用
//.....
上面那個~A()讓很多人迷惑,其實這只是那個臨時對象釋放而已。
這個臨時對象,在大多數(shù)場合不產(chǎn)生任何有功能的影響力。
這種調(diào)用,往往被很多人誤解,以為可以通過構(gòu)造函數(shù)的重載和相互調(diào)用實現(xiàn)一些類似默認(rèn)參數(shù)的功能,其實是不行的,而且往往有副作用。
而同一個類的構(gòu)造函數(shù)又不能寫在初始化成員列表里面,那怎么樣才能實現(xiàn)這種需求呢?
偶只知道一個方法:
額外增加一個Init函數(shù),在不同的構(gòu)造函數(shù)中用不同的參數(shù)調(diào)用這個函數(shù)即可。
雖然不夠優(yōu)雅,但是勉強夠用了。
Feedback
# 回去想了一下,差不多明白了,不過還是恐慌兄快呀,;P
2005-06-10 09:16 by 笑柄
A::A()
{
A(0); //注意
//這個地方構(gòu)造了一個對象,由于沒有人接收該對象,即該對象為該函數(shù)的局部變量,則離開該函數(shù)域則銷毀,故析構(gòu)是必然的
}
# LOOK THIS!!!use placehold constructor
2005-06-10 11:00 by
class A
{
public:
A();
A(int i);
~A();
}
A::A()
{
new(this)A(0);
}
A::A(int i)
{
}
A::~A()
{
}
# another way is ->
2005-06-10 11:06 by
A::A()
{
*this=A(0);
}
but not efficiency
referring to :
http://blog.vckbase.com/bastet/archive/2005/03/03/3370.html
# 成員初始化列表
2005-06-11 21:14 by
如題!
這個是C++,不是java,所以C++兄弟要小心一點。(開始自己也以為類似,可以的)