为什么我们使用复制构造函数?复制构造函数有什么好处和坏处?
答案 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];
};