当您以下列方式初始化向量时:
std::vector<MyClass> MyVec(10);
它调用默认构造函数一次,然后再调用复制构造函数 10 次。所以,如果我理解正确的话,向量中的对象都是由复制构造函数创建的。
有人可以解释调用复制构造函数而不是默认构造函数的原因吗?或者甚至只是在没有对象的情况下分配内存?
当您以下列方式初始化向量时:
std::vector<MyClass> MyVec(10);
它调用默认构造函数一次,然后再调用复制构造函数 10 次。所以,如果我理解正确的话,向量中的对象都是由复制构造函数创建的。
有人可以解释调用复制构造函数而不是默认构造函数的原因吗?或者甚至只是在没有对象的情况下分配内存?
它将分配没有对象的内存,除非您指定初始大小为 10,因此它必须创建 10 个对象。如果您想要 10 个对象的内存而不实际创建它们,您可以执行以下操作:
std::vector<MyClass> MyVec;
MyVec.reserve(10);
如果您查看正在使用的构造函数的签名,则类似于:
vector(size_t num, T initial_value = T());
这让你传递一个值来填充你告诉它创建的点。如果您不指定值,它会创建一个(使用默认 ctor)传递给 ctor,然后在向量本身中复制该值。
毫无疑问它可以做其他事情,但这在简单性(不指定值)、多功能性(如果需要,请指定值)和代码大小(避免将整个 ctor 复制为默认值)之间提供了合理的平衡构建内容)。