2016-05-16 58 views
0

我很困惑,爲什麼我必須編寫這個類的拷貝構造函數,當我在第一個提到的類的返回類型中定義一個函數在另一個類中時。當我定義一個具有該類的非引用返回類型的函數時,哪一個類的默認或複製構造函數被調用?

例如:

class Foo{ 
    // attributes 
public: 
    Foo(){...} 

    // I had to write the CC 
    Foo(const Foo& obj){ 
     //... 
    } 
} 

class Bar{ 
// .... 

// This is the function 
Foo SomeFunction() 
{ 
    Foo myVar; 

    // .... 

    return myVar; 
} 

我檢查了由荷蘭國際集團cout的拷貝構造函數實際上是被調用。

我需要確認,因爲在這種情況下調用默認的構造函數似乎更符合邏輯,就像在創建myVar的這一行中一樣。

我是初學者,所以我試圖圍繞這些調用包圍我的頭。

+1

'myVar'是函數內部的局部變量,它需要被複制到外部變量。 – songyuanyao

+0

@songyuanyao所以複製構造函數在複製時被調用? – developer10

+0

是的,通過複製ctor或複製分配。 – songyuanyao

回答

3

Foo myFunc; 

調用默認的構造函數。

return myFunc; 

調用拷貝構造函數,因爲函數的返回類型是Foo。從函數返回的對象不是myFunc,而是myFunc的副本。當函數返回時,myFunc被刪除。副本是調用函數獲取的內容。

如果編譯器能夠使用RVO(return value optimization),那麼將myFunc返回給調用函數,而不是副本。在這種情況下,複製構造函數將不會被調用。

+1

中實際存在複製操作,具體取決於編譯器的優化功能,如果應用NRVO,return語句實際上也可以調用移動構造函數。 –

+1

@TheParamagneticCroissant,一般的好點。對於這個特定的情況,隱式聲明的移動構造函數被刪除,因爲OP有一個拷貝構造函數,至少這是我的理解。 –

+0

是的,我不想挑剔,只是增加了這一點,因爲OP可能有興趣知道,如果他/他未來遇到可移動類型。 –

-1

您不必在C++上編寫CC。編譯器應該給你一個。 是的,在這種情況下將調用CC,因爲您試圖將返回值作爲副本傳遞。

+0

默認的cc在這種情況下不起作用,因爲我必須有一些指針被初始化。 – developer10

+0

你不應該低估這一點,因爲你沒有展示完整的類實現,我說的完全是真實的。如果你的類有沒有定義CC的屬性,那就是你在使用一個屬性時需要指定的屬性。 – Bhupesh

+0

不是我低估了你的答案。 – developer10

相關問題