在c ++中使用私有拷贝构造函数有什么用处

42 c++ copy-constructor assignment-operator

为什么人们定义私有拷贝构造函数?

何时使复制构造函数和赋值运算符私有化是一个好的设计?

如果有哪个是指针或处理到一个唯一的对象(如文件名)类没有成员,然后笏其他情况下都存在,其中私人拷贝构造函数是一个好主意?

同样的问题适用于赋值运算符.鉴于大多数C++围绕复制对象并通过引用传递,是否有任何涉及私有拷贝构造函数的好设计?

Eri*_*c Z 35

一个用例是单例模式,其中只能有一个类的实例.在这种情况下,您需要使构造函数和赋值operator = private,以便无法创建多个对象.创建对象的唯一方法是通过GetInstance()函数,如下所示.

// An example of singleton pattern
class CMySingleton
{
public:
  static CMySingleton& GetInstance()
  {
    static CMySingleton singleton;
    return singleton;
  }

// Other non-static member functions
private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};

int main(int argc, char* argv[])
{
  // create a single instance of the class
  CMySingleton &object = CMySingleton::GetInstance();

  // compile fail due to private constructor
  CMySingleton object1;
  // compile fail due to private copy constructor
  CMySingleton object2(object);
  // compile fail due to private assignment operator
  object1 = object;

  // ..
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 哦...这是一种情况......即使构造函数在这种情况下也是私有的.... (2认同)

Ton*_*roy 32

某些对象表示不能或不应复制的特定实体.例如,你可能会阻止它表示由一个应用所使用的日志文件中,对应于单个日志文件将通过代码的所有部分中使用的期望的对象的拷贝.使用意外或不正确复制的对象可能导致日志中出现无序内容,当前日志大小的不准确记录,多次尝试(某些失败)"滚动"到新的日志文件名或重命名现有文件名.

另一个用途是通过虚函数强制执行复制.由于构造函数不可能virtual,通常的做法是阻止直接访问复制构造函数,并提供一个virtual Base* clone()返回指针指向的实际运行时类型的副本的方法.这可以防止意外切片Base b(derived).

另一个例子:一个死简单的智能指针对象,它只是删除它在构造函数中给出的指针:如果它不支持引用计数或其他一些处理多个所有者的方式,并且不希望有风险笨拙的意外std::auto_ptr风格转移所有权,然后简单地隐藏复制构造函数提供了一个很好的小智能指针,它可以快速有效地用于可用的有限情况.约试图复制它会有效地问程序员编译时错误"哎-如果你真的想这样做改变我的共享指针,否则后退!".