首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中防止意外复制对象

在C++中防止意外复制对象
EN

Stack Overflow用户
提问于 2009-08-27 09:27:36
回答 4查看 9.6K关注 0票数 18

在我们公司的编码标准中,我们被告知“要知道可以防止(意外)复制的方法”。

我不太确定这是什么意思,但假设他们的意思是我们应该停止复制类,如果这不是必需的。

我所能想到的是:

  1. 使类的复制构造函数为私有。
  2. 使类的赋值运算符(operator=)为私有。
  3. 使类的构造函数显式(若要停止使用不正确的方法创建类,请确保复制构造函数和赋值运算符执行深度复制而不是浅复制。

我在正确的轨道上吗?有没有什么我可能遗漏的?

EN

回答 4

Stack Overflow用户

发布于 2009-08-27 09:34:18

是的,将赋值运算符和复制构造函数设置为私有将阻止您使用standart方法创建对象的任何副本(但如果您确实需要对象的副本,则可以实现,例如,Copy()方法,它将执行深度复制)。

看看boost::noncopyable吧。

更新 (re to Tal Pressman):

...you应该意识到这些事情,并注意不要意外地复制了不应该复制的对象。

好吧,我假设,任何意外的复制都将使用赋值操作符或复制构造函数来执行。因此,将它们设置为私有实际上是有意义的:如果对象复制是代价高昂的操作,那么复制必须是显式的:其他开发人员可以无意中间接调用copy op,编译器会通知他,这是被禁止的。

票数 21
EN

Stack Overflow用户

发布于 2009-08-27 09:31:23

如果您正在使用boost,那么防止类被复制的最简单方法是从noncopyable派生您的类

代码语言:javascript
复制
#include <boost/noncopyable.hpp>

class Foo : private boost::noncopyable
{
}

它使您的意图比手动将复制构造函数和赋值运算符设置为私有更清晰,并且具有相同的结果。

票数 11
EN

Stack Overflow用户

发布于 2009-08-27 09:39:04

你在正确的轨道上。如果您不想使用boost,您可以执行以下操作:将复制构造函数和复制赋值运算符设置为私有,并且不实现它们。因此,如果你试图复制一个实例,你会得到一个编译器错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1339922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档