2011-04-22 106 views
0

C++說我們不能從構造函數中返回任何東西?背後的歷史原因是什麼? 爲什麼Bjarne不允許構造函數返回與其他成員函數不同的東西?爲什麼我們不能從構造函數中返回任何東西?

+6

你會回來麼? – BlackBear 2011-04-22 15:51:54

+1

對於從構造函數返回* something *的建議,你有什麼理由?我會說它沒有意義,這就是爲什麼它不返回*的東西*。 – Nawaz 2011-04-22 15:52:30

+0

BlackBear該類的對象。我知道這是隱含的,但爲什麼? – user724619 2011-04-22 15:52:50

回答

4

因爲當在new語句或變量初始值設定項中構造對象時,返回的對象是正在構造的新對象。對於從構造函數返回的對象,你會做什麼?它永遠無法返回到任何地方;它是正在返回的構造對象。該對象在構造函數被調用之前已經(部分)創建(否則,構造函數將沒有對象可用),並且它必須是從構造函數返回的內容,所以沒有必要讓用戶返回它或讓它們通過嘗試返回不同的東西來混淆自己。

+0

不夠公平。接受你的答案。 – user724619 2011-04-22 16:06:33

+0

還要考慮臨時性 - 'std :: string(「hello,world」)'。這既不是一個新的聲明,也不是一個變量初始值設定項,所以你可以簡單地想象它可能會返回一個不同的對象。但是,對象佔用的內存不是由構造函數提供的,也沒有明智的方式讓對象可以在臨時創建的堆棧空間之外的任何地方,最好*不要*認爲這是「僅僅對構造函數的調用「。 – 2011-04-22 17:12:35

1

的構造函數只能得到對象本身...

3

我認爲一個構造函數返回本身,但不必有return聲明。

如果它自己返回,那麼它不能返回任何其他東西。

2

我不能說Bjarne,但查看構造函數的慣用方式是它返回它構造的對象。

+0

:)因此,術語 - C O N S T R U C T O R – KevinDTimm 2011-04-22 15:56:35

1

除了讓構造函數返回一些東西會使構造函數有兩件事而不只是一件事(這通常是一件不希望的事情),請注意構造函數不能被命名,因此不可能明確地調用它們。因爲不可能構造一個表達式,這個表達式是對構造函數的顯式調用,所以無論如何都不可能分配或引用構造函數的返回值。

試圖從構造函數返回某些東西根本不符合語言設計。

構造函數不「返回」對象,它們初始化調用它們的內存區域中的對象。如果聲明具有靜態存儲持續時間的類類型對象(並且該類型具有用戶聲明的構造函數),則該內存在程序的整個生命週期中保留,實現確保調用構造函數以初始化該位置的對象在該計劃的適當時間。同樣,如果聲明瞭具有自動存儲持續時間的對象並且該對象具有自動存儲持續時間,則該實現會在每次執行聲明語句時預留空間(非正式地稱爲某個堆棧空間)並調用構造函數。

對於新的表達式,內存是動態分配的,實現調用相應的構造函數來初始化對象。

請注意,如果X是一個類類型,則所有這些語句中的X始終引用該類型的名稱,永遠不會包含實際上沒有名稱的構造函數。聲明或定義構造函數的語法是特殊的,並不意味着構造函數具有名稱。假設X有一個用戶聲明的構造函數。

X x; // Initialize an object of type X using the default constructor 

X(); // Value initialize a temporary of type X. Not an explicit constructor call. 

new X(); // new expression: value-initialize a dynamically allocated X 

X(a); // A function style cast 

X(a, b); // Construct an X from the expression list. X must have a 
     // suitable constructor but the X still refers to the type. 
0

構造沒有retunrn型bacause它已經爲前返回refrence_id到refrence變量(被稱爲對象): - 的Emp E1 =新的Emp(refrence_id) 這裏的Emp是CLASS_NAME E1是refrence變量 新的用於動態分配 的Emp()是類的Emp 在此構造函數構造函數返回refrence_id到refrence變量E1

相關問題