为什么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
:
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();
如果你想真的短手。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 编译器调用复制运算符而不是移动运算符
- push_back std::vector,则重复调用复制构造函数
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- C++ - 从移动分配运算符调用复制分配
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时
- 为什么在下面的代码中调用复制构造函数两次