2012-12-06 17 views
1
const ClassA& curShot = vec_shots[curShotIndx]; 

在上面的代碼中,curShot對象是在同一步驟中構造和分配的。我的問題是在上面的語句中使用了哪個構造函數。我認爲這將是默認的構造函數,然後賦值運算符,但它似乎調用拷貝構造函數來代替。爲什麼會這樣?在同一步驟中構建一個新的對象和作業

+0

&符號('&')在你的問題中是一個錯字,不是嗎? –

+0

'curShot'是一個'const'參考。類似地,你正在做的東西等同於:'const ClassA * const curShot = vec_shots [curShotIndx];' – iammilind

回答

4

會發生什麼事是,

vec_shots[curShotIndx]; 

返回其分配給const ClassA& curShot參考。這一步中沒有創建對象。因此沒有構造函數被調用(既不是默認也不是複製構造函數)。

賦值運算符,則不會調用要麼因爲你沒有分配一個對象實例到另一個,但只是一個參考。您不在此代碼中處理多個(現有)對象實例。所以,不會調用任何構造或分配。

+0

謝謝安德烈亞斯,只是我有一個上面的&。不過,我很欣賞你的答案,因爲我不確定它會怎麼做。 – vkaul11

1

沒有構造函數時,curShot是一個參考,別名到一個已經存在的對象,而不是本身就是一個獨立的對象。

此外,初始化和賦值不能在同一工序完成。例如,說你有

ClassA original; 
ClassA copy = original; 

這裏,copy未分配original,它使用original initalized。這被稱爲複製初始化。

如果你沒有

ClassA copy2(original); 

這將被稱爲直接初始化。

拷貝構造函數會在兩種情況下被調用。當你已經存在的物體上使用operator =copy elision可以出現,所以它可能不會被調用,但它必須是可用的)

分配是:

ClassA x; 
ClassA y; 
x = y;  //assignment 
+0

-1 *複製構造函數將在兩個實例中調用。*誤導性錯誤。 –

+0

@哪一個不叫? –

+0

在複製初始化期間是否調用複製構造函數完全取決於類定義。如果類提供了比複製構造函數更適合的轉換運算符,那麼將使用它。 –

0

這種說法只是定義curShot作爲參考,這不是一個新的對象。

1

既然你寫了「它似乎打電話給複製構造函數」,我認爲你的問題的&符號是一個錯字
在這種情況下,如果你會做

const ClassA curShot = vec_shots[curShotIndx]; 

其被評估爲拷貝構造。它跟醜陋的const ClassA curShot(vec_shots[curShotIndx])一樣。

但是,如果你寫

ClassA curShot; // I skipped the "const", because otherwise the example would be invalid. 
curShot = vec_shots[curShotIndx]; 

那麼默認的構造函數被調用和opearator=被稱爲第二行。


此外,「=」這麼多可能意味着既不調用拷貝構造函數NOR operator=,你可以有這樣的:

const ClassA f(){ return ClassA(); } 
//... 
const ClassA curShot = f(); // we would expect here a copy constructor call 

這裏 - 如果編譯器使用返回值優化,通常它 - 只有一個默認的構造函數被調用curShot。

+0

它沒有,沒錯,我會糾正它。 –

+0

這確實是一個錯字。謝謝。 – vkaul11

相關問題