为什么不允许复制构造函数和赋值运算符?

Mai*_*nID 6 c++

#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \
   TypeName(const TypeName&);                           \
   void operator=(const TypeName&)
Run Code Online (Sandbox Code Playgroud)

我是,从谷歌阅读开源代码.为什么不允许复制构造函数和赋值运算符?

小智 12

防止复制或分配类的实例.大多数课程不允许复制.考虑一下例如BankAccount类 - 如果您正在为银行编写软件,如果您创建帐户副本然后将信用和借记应用于这些不同的副本,他们将不会太高兴.

  • @MainId单身人士意味着只有一个银行账户可能存在 - 银行必须要成千上万的东西. (4认同)

jam*_*lin 7

复制构造函数和复制赋值运算符的问题在于,如果没有显式声明,编译器会自动生成实现.

这很容易造成意外问题.如果一个类有一个非平凡的析构函数,它几乎总是需要为复制构造函数和复制赋值运算符提供自己的实现(这是三巨头法则),因为默认的编译器生成的通常会执行错了.

违反三巨头法则经常会导致错误,例如数据成员的双重释放和内存损坏.这种错误的出现并不少见,因为班级的作者从不打算考虑复制行为,因为消费者很容易无意中复制对象.

除非该类的作者实际上已经考虑过如何正确地复制该类的实例(或者除非该类有一个简单的析构函数),否则最好明确禁止复制以避免潜在的问题.然后可以推迟实现可复制性,直到实际需要它为止.

  • 随着即将推出的标准C++ 0x以及Move Constructor/Assignment的加入,这已经成为"五大法则"! (4认同)