1. 程式人生 > >C++中的建構函式為什麼沒有返回值

C++中的建構函式為什麼沒有返回值

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。於是,語義產生了歧義

使得C++原本已經非常複雜的語法,進一步混亂不堪。
建構函式的呼叫之所以不設返回值,是因為建構函式的特殊性決定的。從基本語義角度來講,建構函式返回的應當是所構造的物件。否則,我們將無法使用臨時物件:
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,於是便會引發上述的型別問題。