复制构造函数的缺点

时间:2010-06-08 09:46:05

标签: c++

为什么我们使用复制构造函数?复制构造函数有什么好处和坏处?

4 个答案:

答案 0 :(得分:3)

“劣势”是对于不可复制的类型,我们必须明确禁止复制:

class Foo
{
    // ...

private:

    Foo(const Foo&);
    Foo& operator=(const Foo&);
}

答案 1 :(得分:1)

我刚刚读到这个。我很确定这也是正确的,以及其他答案。请注意,这适用于分配。

如果没有为您创建的对象指定复制构造函数,那么尝试复制它,编译器可能会创建一个不适合您的对象的复制构造函数。

假设您有一个具有指针成员的类,并且您没有指定复制构造函数。如果编译器决定简单地复制对象,则指针也将指向与原始对象相同的内存,当一个对象释放该指针的内存时会导致各种麻烦,但它仍然存在在另一个人的使用中。

编辑:更新此内容以反映sbi所说的内容。我认为其余的都是正确的。

答案 2 :(得分:1)

我能想到的复制构造函数的唯一缺点是复制一些大对象可能很昂贵(例如,复制长字符串涉及分配大块内存然后复制所有内容)。 C ++ 0x在某种程度上使用 move constructors 解决了这个问题,它允许将一个对象的内容移入另一个对象,这通常是一种廉价的操作。

答案 3 :(得分:0)

我们使用自定义复制构造函数,以便我们可以复制对象。可以通过简单地复制其数据成员来复制许多对象,因此可以依赖于编译器生成的默认复制构造函数,但有时这并不能充分捕获需求。例如,一个对象可能有一些数据成员指向同一对象中的其他数据成员。只需将指针复制到目标对象,就会使目标中的数据成员指向源对象中的数据成员。

例如:

class FastString {
public:
    ...
    FastString(const FastString& s) : len_(s.len_) {
        start_ = len_ > 8 ? new char[len_] : &insitu_;
        memcpy(start_, s.start_, len);
    }
    ...

private:
    char *start_;
    size_t len_;
    char insitu_[8];
};