4

我的类A显式地实现了它的复制构造函数和它的复制赋值。

复制分配此类元素的向量时使用哪种复制机制?

这是:

vector<A> a1, a2(5);
a1 = a2;

是否要对A的所有新元素使用 的复制构造函数a1,并将 的元素a2作为输入?

或者它会a1为元素腾出空间,然后将A'soperator=与元素一起a2用作输入?

如果a1在分配之前不为空怎么办?

甚至指定了吗?

我班级的复制构造函数并operator=没有完全做同样的事情(这是不好的做法吗?到目前为止主要是测试东西)。看起来复制构造函数被调用了,但我想知道它是否可以保证是这样,或者在这种情况下恰好是这样。

4

2 回答 2

4

在这种情况下,它将调用复制构造函数 5 次。由于a1为空,因此没有任何要分配的元素。所以它们需要被复制构造。

通常,它会调用适当的复制/移动构造/分配或删除的任何混合。这一切都取决于相关向量的大小、您正在执行的特定向量操作以及操作数的值类别。

于 2016-11-09T09:59:58.743 回答
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) { ... }
};

这种分配实现的缺点是 - 由于它的普遍性 - 它不是最佳的(例如,在自我分配的情况下它做了不必要的工作)。

一般来说,如果可以排除异常安全问题,则分配给对象的副本可以比销毁它并构造源对象的就地副本更快。因此,您应该期望寻求性能的实现将通过分配而不是尽可能复制构造其子对象来执行对象的分配。

于 2016-11-09T10:24:25.597 回答