为什么C++在迭代容器时会调用复制构造函数?

Ena*_*ane 0 c++ copy-constructor

void ParticleGeneratorController::generate() {
    for( unsigned i = 0; i < generators.size(); i++) {
        ParticleGenerator generator = *generators[i];
        generator.update();
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎调用了复制构造函数或其他东西,但我没有定义一个.我只有一个显式的默认构造函数.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试通过.

为什么在第一个实现中调用了复制构造函数?它是如何由编译器生成的?

hmj*_*mjd 5

这一行导致副本:

ParticleGenerator generator = *generators[i];
Run Code Online (Sandbox Code Playgroud)

如果未显式指定复制构造函数(或赋值运算符),则编译器会自动生成一个.如果您希望阻止复制对象,您可以声明复制构造函数和赋值运算符,而不是将其定义为private:

ParticleGenerator
{
public:

private:
    ParticleGenerator(const ParticleGenerator&);
    ParticleGenerator& operator=(const ParticleGenerator&);
};
Run Code Online (Sandbox Code Playgroud)

  • 或者使用c ++ 11`delete`:http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions (4认同)

jua*_*nza 5

ParticleGenerator每次执行此操作时,您都在创建一个新的:

ParticleGenerator generator = *generators[i];
Run Code Online (Sandbox Code Playgroud)

这是一个复制初始化,并且,如果您没有显式提供复制构造函数,则使用编译器合成的构造函数.