為什麼建構函式沒有返回值?

2021-06-15 03:24:59 字數 1565 閱讀 6041

意見(1)

我認為建構函式隱含的返回值就是this,因為建構函式是在類的物件產生時自動呼叫。建構函式被呼叫也就意味著產生了乙個物件,而this指標是與物件實體相關聯的,所以我認為它返回的就是this。舉例如下:  

class   a  

;  

a   aa;此語句導致類a的建構函式a()被自動呼叫返回乙個首位址,系統就在記憶體中分配一塊區域用來存放物件aa。這個首位址就被賦給this.

意見(2)

返回的確實應該是   a&   型別,可以利用vc的乙個bug證明這一點:  

class   a  

};  

class   b:public   a  

};  

void  

main(void)  

另外,我實在想不出這個返回只有什麼用,編譯器在進入建構函式之前就知道this的值了,然後建構函式又返回了乙個*this,而且vc至少是忽略掉這個返回值的。

意見(3)

規範規定建構函式沒有返回值。

意見(4)

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

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

建構函式的返回值

今天看到同學們在討論乙個問題,這個問題是知乎上的乙個問題,問題描述如下 class a int main 這個問題很有意思的,a的建構函式裡面什麼都沒有,那麼返回乙個怎麼樣的物件呢,還是會出錯呢?顯然這個程式是能夠編譯通過的,但是我們該怎麼認識它呢,我們來看看反彙編吧。可以看到 在call呼叫建構函...

建構函式有返回值

function f1 console.log new f1 返回例項,委託原型 console.log new f1 name f1 console.log f1 name uncaught typeerror cannot read property name of undefined cons...

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

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有乙個但引數建...