我的班级A
显式实现了其复制构造函数及其复制赋值。
在复制分配此类元素的向量时使用哪种复制机制?
这是:
vector<A> a1, a2(5);
a1 = a2;
对A
的所有新元素使用a1
的复制构造函数,并使用a2
元素作为输入?
或者它是否会在a1
为元素腾出空间,然后使用A
的{{1}}并将operator=
元素作为输入?
如果a2
在作业之前不为空,该怎么办?
是否指定了?
我班级的复制构造函数和a1
并不是完全相同的东西(这是不好的做法?主要测试到目前为止的东西)。它看起来像复制构造函数被调用,但我想知道它是否保证是这样的,或者在这种情况下恰好是这样。
答案 0 :(得分:4)
在此上下文中,它将调用复制构造函数5次。由于a1
为空,因此分配的任何元素都没有。所以他们需要复制。
通常,它会调用复制/移动构造/赋值或删除的任何混合。所有这些都取决于所讨论的向量的大小,您正在执行的特定向量操作以及操作数的值类别。
答案 1 :(得分:0)
看起来复制构造函数被调用了,但我想知道它是否保证是这样的,或者在这种情况下恰好是这样。
可以保证基于异常安全swap
的分配实现:
struct SomeClass
{
SomeClass(const SomeClass& other) { ... }
SomeClass(SomeClass&& other) { ... }
// Copy/move construction is performed while initializing the parameter
void operator=(SomeClass other)
{
this->swap(other);
}
void swap(SomeClass& other) { ... }
};
这种赋值实现的缺点是 - 由于它的通用性 - 它不是最优的(例如,它在自我赋值的情况下做了不必要的工作)。
通常,如果可以排除异常安全问题,则复制分配给对象的速度可以比破坏它并构建源对象的就地副本更快。因此,您应该期望性能寻求实现将通过赋值来执行对象的赋值,而不是尽可能地复制它们的子对象。