35
class A
{
public:
    A() = default;
    A(const A&) = delete;
};

class A
{
public:
    A() = default;

private:
    A(const A&) = delete;
};

这两个定义在任何情况下总是彼此相同吗?

4

2 回答 2

50

它们仅在产生的诊断方面有所不同。如果你成功了private,则会报告一个额外的和多余的访问冲突:

class A
{
public:
    A() = default;
private:
    A(const A&) = delete;
};

int main()
{
    A a;
    A a2=a;
}

从 GCC 4.8产生以下附加输出:

main.cpp: In function 'int main()':
main.cpp:6:5: error: 'A::A(const A&)' is private
     A(const A&) = delete;
     ^
main.cpp:12:10: error: within this context
     A a2=a;
          ^

因此我建议总是删除方法public

于 2013-09-21T09:46:04.880 回答
13

我想扩展Daniel Frey 的回答。我宁愿给这些方法一个访问修饰符,而不是总是让这些方法被删除,如果它们不被删除,你会(假设 给这些方法(我不喜欢程序员选择权的情况。如果确实要刻板地制作删除方法,那么它应该由语言本身强制执行。)publicpublic

一些经验法则/指南:

  • 在大多数情况下,复制和移动赋值运算符将public位于具体和抽象类中。
  • 在大多数情况下,复制和移动构造函数将public位于具体类中。
  • 在大多数情况下,复制和移动构造函数将protected位于抽象类中。
  • 复制和移动构造函数将在大多数情况下只能被实例化的private具体类中。finalfriends

在所有情况下,您都会向班级的适当用户而不是班级的所有用户发布通知。

于 2017-04-08T17:18:16.317 回答