在C 中,為什麼建構函式不能有返回值?

2021-05-10 09:54:02 字數 991 閱讀 8645

(1)假設有乙個類c,有如下定義:

class c

c(int i):x_(i) {}

private:

int x_;

};如果c的建構函式可以有返回值,比如int:

int c():x_(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,於是便會引發上述的型別問題。

(2)只是c++標準規定了構造/析構/自定義型別轉換符不可以指定返回型別。

但你不能據此就說它們沒有返回型別。

(3)本人的意見是建構函式是有返回值的,返回的就是新構造的物件本身,但是不能指定返回型別,因為你用這個類的建構函式表明就是返回這個類的乙個物件,沒有必要指定返回型別,即使是指定也必須是指定類本身的返回型別,這就多次一舉了吧。

介面為什麼不能有建構函式

下面比較一下兩者的語法區別 1.抽象類可以有構造方法,介面中不能有構造方法。2.抽象類中可以有普通成員變數,介面中沒有普通成員變數 3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。抽象類中的抽象方法的訪問型別可以是public,protected和 預設...

error C2533 建構函式不能有返回型別

c 程式設計隱蔽錯誤 error c2533 建構函式不能有返回型別 今天在編寫類的時候,出現的錯誤。提示乙個類的建構函式不能夠有返回型別。在cpp檔案裡,該建構函式定義處並沒有返回型別。在標頭檔案裡,建構函式原型也無返回型別。這就奇怪了,憑藉多年的程式設計經驗,似乎有一些似曾相識的靈感 以前似乎犯...

C 建構函式為什麼不能是虛函式

這裡你需要知道乙個概念,那就是虛函式表vtbl 每乙個擁有虛成員函式的類都有乙個指向虛函式表的指標。物件通過虛函式表裡儲存的虛函式位址來呼叫虛函式。那虛函式表指標是什麼時候初始化的呢?當然是建構函式。當我們通過new 來建立乙個物件的時候,第一步是申請需要的記憶體,第二步就是呼叫建構函式。試想,如果...