![](/img/trans.png)
[英]Why does the C++ copy constructor behave differently when calling its child copy constructor?
[英]Why does C++ invoke a copy constructor when iterating a container?
void ParticleGeneratorController::generate() {
for( unsigned i = 0; i < generators.size(); i++) {
ParticleGenerator generator = *generators[i];
generator.update();
}
}
似乎要調用一個拷貝構造函數之類的東西,但是我沒有定義一個。 我只有一個顯式的默認構造函數。
https://github.com/ChrisLundquist/Waveform/blob/master/src/models/particle_generator.h
給定我上面的代碼,通過測試失敗。 https://github.com/ChrisLundquist/Waveform/blob/master/spec/controllers/particle_generator_controller_spec.cpp#L21
當寫為
void ParticleGeneratorController::generate() {
for( unsigned i = 0; i < generators.size(); i++) {
generators[i]->update();
}
}
測試通過。
為什么在第一個實現中調用復制構造函數? 編譯器如何生成?
此行導致復制:
ParticleGenerator generator = *generators[i];
如果未明確指定副本構造函數(或賦值運算符),則編譯器會自動生成一個副本構造函數。 如果您希望防止對象的復制,則可以將復制構造函數和賦值運算符聲明為private
,而不是將其定義為private
:
ParticleGenerator
{
public:
private:
ParticleGenerator(const ParticleGenerator&);
ParticleGenerator& operator=(const ParticleGenerator&);
};
每次執行此操作時,您將創建一個新的ParticleGenerator
:
ParticleGenerator generator = *generators[i];
這是一個副本初始化,並且由於您沒有明確提供副本構造函數,因此使用編譯器綜合的副本構造函數。
以下行進行復制:
ParticleGenerator generator = *generators[i];
如果您未定義副本構造函數,則編譯器會自動為您完成。 為了禁用它,您可以將復制構造函數聲明為私有,而不實現它。 通常,這也應該使用副本分配運算符來完成。
如果要避免在代碼中進行復制,則只需創建一個指針即可。 寫
ParticleGenerator * generator = generators[i];
generator->update();
進入您的循環。 要么
generators[i]->update();
如果您想成為真正的捷徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.