C++中的建構函式為什麼沒有返回值
阿新 • • 發佈:2019-02-02
class C
{
public:
C() : x(0) {} //無參建構函式
C( int i ) : x(i) {} //帶參建構函式
private:
int x
};
如果C的建構函式可以有返回值,比如int:
int C():x(0) { return 1; //1表示構造成功,0表示失敗}
那麼下列程式碼會發生什麼事呢?
C c=C(); //此時c.x==1!
很明顯,C()呼叫了C的無引數建構函式。該建構函式返回int值1。恰好C有一個但引數建構函式C(int i)。於是,混亂來了。按照C++的規定,C c=C();是用預設建構函式建立一個臨時物件,並用這個臨時物件初始化c。此時,c.x的值應該是0。但是,如果C::C()有返回值,並且返回了1(為了表示成功),則C++會用1去初始化c,即呼叫但引數建構函式C::C(int i)。得到的c.x_便會是1。於是,語義產生了歧義
建構函式的呼叫之所以不設返回值,是因為建構函式的特殊性決定的。從基本語義角度來講,建構函式返回的應當是所構造的物件。否則,我們將無法使用臨時物件:
void f( int a ) {...} //(1)
void f( const C& a ) {...} //(2)
f(C()); //(3),究竟呼叫誰?
對於(3),我們希望呼叫的是(2),但如果C::C()有int型別的返回值,那麼究竟是調(1)好呢,還是呼叫(2)好呢。於是,我們的過載體系,乃至整個的語法體系都會崩潰。
這裡的核心是表示式的型別。目前,表示式C()的型別是類C。但如果C::C()有返回型別R,那麼表示式C()的型別應當是R,而不是C,於是便會引發上述的型別問題。