#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
我是,从谷歌阅读开源代码。 为什么复制构造函数和赋值运算符是不允许的?为什么复制构造函数和赋值运算符是不允许的?
#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
我是,从谷歌阅读开源代码。 为什么复制构造函数和赋值运算符是不允许的?为什么复制构造函数和赋值运算符是不允许的?
如果您的类型包含指针或引用成员,或者它没有语义上的意义(例如它有一个必须在析构函数中释放的资源句柄),那么禁用复制构造函数和赋值运算符。在C++ 0x中(例如,在g ++ 4.4或更高版本中,在-std = C++ 0x模式下),您可以声明它们已被删除。在较早的编译器中,您只需将它们声明为私有并且未实现。
复制构造函数和复制赋值操作符的问题是,如果编译器没有明确声明,编译器会自动生成实现。
这很容易导致意想不到的问题。如果一个类具有非平凡的析构函数,那么它几乎总是需要为复制构造函数和复制赋值运算符提供它自己的实现(这是Law of the Big Three),因为默认的编译器生成的通常会做错误的事情。
违反三大法则往往会导致数据成员和内存损坏等错误。出现这种类型的错误并不罕见,因为类的作者从来不会考虑复制行为,而且消费者很容易无意中复制对象。除非类的作者已经真正考虑过如何正确地复制该类的实例(或者除非该类具有微不足道的析构函数),否则最好明确禁止复制以避免潜在的问题。实现可复制性可以推迟到实际需要时为止。
它们被称为“复制构造函数”和“赋值运算符”。作为赋值构造函数没有这样的事情。 – Sjoerd 2010-08-06 08:40:05
我会称它们为“构造函数”和“赋值运算符”或“复制构造函数”和“复制赋值运算符” – 2010-08-06 09:16:18
我不会调用EVIL,这种颜色让它们在恶劣的光线下着色。只需禁用它们就像boost:boost :: noncopyable – 2010-08-06 18:19:33