在C++中禁止复制构造函数的最可靠方法是什么?

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)

  • @sehe:使用`delete`没有理由将其设为私有.事实上,让它出现在公共界面似乎更好,用户明智. (7认同)

Dar*_*uuk 16

第一种方法是Boost如何解决它(源代码),据我所知,没有任何缺点.实际上,链接器错误是该方法的一大优势.您希望错误发生在链接时,而不是在客户端执行代码时它会突然崩溃.

如果您使用Boost,您可以节省一些打字.这跟你的第一个例子一样:

#include <boost/utility.hpp>

class Class : boost::noncopyable {
// Stuff here
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然它可能是"Boost如何解决它",但在基类中以这种方式解决它并在你自己的类中自己做它之间仍然存在显着差异,因为基类方法更加自我记录,不小心阻止某人稍后在课堂上添加它,认为它没有被错误地实现. (7认同)

Mar*_*k B 7

你总是可以继承boost::noncopyable.

否则我从未见过数字2优于数字1的原因,因为它允许你在朋友或类方法中"复制构造"一个​​对象,即使它实际上不会创建对象的真实副本.