const ClassA& curShot = vec_shots[curShotIndx];
在上面的代碼中,curShot對象是在同一步驟中構造和分配的。我的問題是在上面的語句中使用了哪個構造函數。我認爲這將是默認的構造函數,然後賦值運算符,但它似乎調用拷貝構造函數來代替。爲什麼會這樣?在同一步驟中構建一個新的對象和作業
const ClassA& curShot = vec_shots[curShotIndx];
在上面的代碼中,curShot對象是在同一步驟中構造和分配的。我的問題是在上面的語句中使用了哪個構造函數。我認爲這將是默認的構造函數,然後賦值運算符,但它似乎調用拷貝構造函數來代替。爲什麼會這樣?在同一步驟中構建一個新的對象和作業
會發生什麼事是,
vec_shots[curShotIndx];
返回其分配給const ClassA& curShot
參考。這一步中沒有創建對象。因此沒有構造函數被調用(既不是默認也不是複製構造函數)。
賦值運算符,則不會調用要麼因爲你沒有分配一個對象實例到另一個,但只是一個參考。您不在此代碼中處理多個(現有)對象實例。所以,不會調用任何構造或分配。
謝謝安德烈亞斯,只是我有一個上面的&。不過,我很欣賞你的答案,因爲我不確定它會怎麼做。 – vkaul11
沒有構造函數時,curShot
是一個參考,別名到一個已經存在的對象,而不是本身就是一個獨立的對象。
此外,初始化和賦值不能在同一工序完成。例如,說你有
ClassA original;
ClassA copy = original;
這裏,copy
未分配original
,它使用original
initalized。這被稱爲複製初始化。
如果你沒有
ClassA copy2(original);
這將被稱爲直接初始化。
拷貝構造函數會在兩種情況下被調用。當你已經存在的物體上使用operator =
(copy elision可以出現,所以它可能不會被調用,但它必須是可用的)
分配是:
ClassA x;
ClassA y;
x = y; //assignment
-1 *複製構造函數將在兩個實例中調用。*誤導性錯誤。 –
@哪一個不叫? –
在複製初始化期間是否調用複製構造函數完全取決於類定義。如果類提供了比複製構造函數更適合的轉換運算符,那麼將使用它。 –
這種說法只是定義curShot作爲參考,這不是一個新的對象。
既然你寫了「它似乎打電話給複製構造函數」,我認爲你的問題的&符號是一個錯字。
在這種情況下,如果你會做
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。
它沒有,沒錯,我會糾正它。 –
這確實是一個錯字。謝謝。 – vkaul11
&符號('&')在你的問題中是一個錯字,不是嗎? –
'curShot'是一個'const'參考。類似地,你正在做的東西等同於:'const ClassA * const curShot = vec_shots [curShotIndx];' – iammilind