我有以下類別:這是隱式地調用一個拷貝構造函數嗎?
class Player
{
public:
Inventory& GetInventory()
{
return inventory;
}
private:
Inventory inventory;
};
class Inventory
{
// Methods removed for brevity
private:
std::vector<std::string> items;
};
我想要做的就是讓代碼的用戶修改的Player::inventory
內容,而不能重新分配給不同的對象。簡單的例子:
Player player;
// OK: I want to able to add items.
player.GetInventory().AddItem("Item 1");
// Not OK: I don't want to be able to assign
// Player::inventory to a different Inventory.
Inventory badInventory;
player.GetInventory() = badInventory;
我知道我可以通過修改GetInventory()
返回Inventory* const
做到這一點,但這種情況下是讓我懷疑什麼,我認爲是引用的事實。我相信他們:
- 不是對象本身,所以沒有地址。
- 無法在其生命週期內重新分配。
- 聲明時必須初始化。
對我說badInventory
必須以某種方式被隱式複製。所以我定義了一個拷貝構造函數,希望能記錄電話,就像這樣:
Inventory(const Inventory& rhs)
{
std::cout << "Copy ctor." << std::endl;
}
但是,這永遠不會觸發。所以我的問題歸結爲:這一行發生了什麼?
player.GetInventory() = badInventory;
我在這裏失去了一些東西,但我不知道它是什麼。
感謝您的回答。只是爲了澄清,當你說:'請注意,player.GetInventory()是一個已經存在的對象,所以它不能調用複製構造函數,它只適用於複製構造函數,而不適用於複製指定構造函數?另外,這是否意味着我在這裏的一般用法是通過使用'Inventory * const GetInventory()'來促進'Player'的封裝,假設我只是想阻止重新分配'Player :: inventory',不妨礙複製庫存本身? –
@John查看'初始化'與'賦值'。 – 2014-03-04 17:26:15
@remyabel我知道他們之間的區別。我只是沒有意識到第二種類型的拷貝構造函數,所以我確信評論中沒有錯誤,只是爲了確保。 –