受this question的启发。
通常,复制构造函数和赋值运算符private
的原因是make the class non-copyable,因此只能创建和销毁对象,但不能复制 - 大多数情况下,因为复制它们会毫无意义。在这种情况下,复制构造函数和赋值运算符都是private
而未实现 - 如果该类不可复制,则无人应该复制。
是否存在复制构造函数和赋值运算符需要private
并且同时具有有意义的实现的情况?
答案 0 :(得分:8)
我的猜测是,这对于持有自己列表的类很有用 - 然后它可以在内部复制实例。这实际上只对项目和容器的类有用:
class MyItems
{
private:
/* Copy ctor and =operator */
List list;
public:
void AddItems(MyItems* items)
{
MyItems* added = new MyItems(items);
list.Add(added);
}
};
另一个想法是允许在班级控制的情况下进行克隆。当复制有意义时,这可能很有用,但仅限于特定条件或权限:
class MyClass
{
private:
/* Copy ctor and =operator */
public:
MyClass* clone()
{
if (canClone)
{
MyClass* cloned = new MyClass(this);
return cloned;
}
else
{
return NULL;
}
}
};
答案 1 :(得分:8)
有两种情况立即浮现在脑海中:
friend
S:
假设,作为设计的一部分,你有两个高度耦合的类,其中一个需要能够复制另一个(比如,在工厂模型或其他类似),但你不想让整个世界都能复制它。
包装:
假设您希望能够有条件地克隆某些元素,具体取决于某些内部行为(例如,取决于某些类状态条件) - 从语言角度来看,最简洁的方法仍然是将复制分离为自己的功能。这样可以很好地分离关注点。
答案 2 :(得分:7)
operator =
未实现,以便均匀
friend
无权访问它。如果你实施,就意味着
您希望friend
有权访问。这是一项设计决定。e.g。
class A {
A(const A& obj) { ... }
A& operator = (const A& obj) { ... }
public:
A& clone(const A& obj)
{
*this = obj;
return *this;
}
};
我们已经使用此包装器clone()
来允许用户进行克隆,但是它也明确地显示了他/她正在做什么。