声明构造函数private和= delete之间的区别是什么?

Avr*_*dis 18 c++ constructor copy-constructor private-constructor

例如,我想声明一个类,但我希望客户端无法使用复制构造函数(或复制赋值运算符)

以下两个都不允许使用复制构造函数:

1.

class Track
{
public:
  Track(){};
  ~Track(){};
private:
  Track(const Track&){};
};
Run Code Online (Sandbox Code Playgroud)

2.

class Track
{
public:
  Track(){};
  ~Track(){};
  Track(const Track&)=delete;
};
Run Code Online (Sandbox Code Playgroud)

其中一种方式"比其他方式更正确"还是相同?有副作用吗?

//Does not compile with both the above ways
int main()
{
  Track l;
  Track p(l);
}
Run Code Online (Sandbox Code Playgroud)

jal*_*alf 16

私有化是这种做法的"旧"方式.构造函数仍然存在,但它是私有的,只能从另一个类成员函数中调用.

= delete 删除构造函数.它不是由编译器生成的,它根本就不存在.

所以最有可能的,= delete就是你想要的.(尽管有一点需要注意,并非所有编译器都支持这种语法,所以如果可移植性是一个问题......)


And*_*owl 8

声明复制构造函数private仍然允许Track类的成员函数复制 - 构造该类的实例,同时删除它只是禁止复制构造该对象.

在C++ 11中,删除复制构造函数是表达类是不可复制的事实的正确方法(除非你让成员函数Track或朋友Track复制构造Track对象是有意义的) .


Ker*_* SB 5

将构造函数设为私有在旧C++中基本上是"黑客",因为它是防止用户使用它们的唯一方法.对能力delete的特殊成员函数的C++ 11只是介绍,这是更好,更地道的方式说,一个类不能被复制.因为它是明确的意图.

私有构造函数除了完全禁止其使用之外还有其他用途(例如,它们可以由静态类成员函数调用).因此,仅仅将构造函数设为私有并不能很好地传达意图,结果错误也不是很清楚.