sha*_*oth 21 c++ constructor class-design copy-constructor
有时需要禁止C++类中的复制构造函数,以使类变为"不可复制".当然,operator=应该同时禁止.
到目前为止,我已经看到了两种方法.方法1是将方法声明为private并且不给它实现:
class Class {
//useful stuff, then
private:
Class( const Class& ); //not implemented anywhere
void operator=( const Class& ); //not implemented anywhere
};
Run Code Online (Sandbox Code Playgroud)
方法2是将方法声明为private并将其赋予"空"实现:
class Class {
//useful stuff, then
private:
Class( const Class& ) {}
void operator=( const Class& ) {}
};
Run Code Online (Sandbox Code Playgroud)
IMO第一个更好 - 即使有一些意外的原因导致从同一个类成员函数调用复制构造函数,稍后会出现链接器错误.在第二种情况下,在运行时之前不会注意到这种情况.
第一种方法有任何严重的缺点吗?什么是更好的方式,如果有的,为什么?
seh*_*ehe 27
第一个更好
更好的是C++ 0x'delete'关键字:
class Class {
// useful stuff, then
public:
Class(const Class&) = delete;
void operator=(const Class&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
Dar*_*uuk 16
第一种方法是Boost如何解决它(源代码),据我所知,没有任何缺点.实际上,链接器错误是该方法的一大优势.您希望错误发生在链接时,而不是在客户端执行代码时它会突然崩溃.
如果您使用Boost,您可以节省一些打字.这跟你的第一个例子一样:
#include <boost/utility.hpp>
class Class : boost::noncopyable {
// Stuff here
}
Run Code Online (Sandbox Code Playgroud)
你总是可以继承boost::noncopyable.
否则我从未见过数字2优于数字1的原因,因为它允许你在朋友或类方法中"复制构造"一个对象,即使它实际上不会创建对象的真实副本.