簡體   English   中英

為什么C ++在迭代容器時調用復制構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM