class A
{
public:
A() = default;
A(const A&) = delete;
};
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
在任何情况下,这两个定义是否总是相同?
答案 0 :(得分:36)
它们与产生的诊断不同 。如果您将其设为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
。
答案 1 :(得分:7)
我想延长Daniel Frey's answer。如果不删除这些方法,我宁愿给这些方法提供访问修饰符(假设)给出这些方法,而不是删除方法 public
。 (我不喜欢总是以防程序员有一个选项。如果它确实可以用来制作删除的方法public
,那么它应该由语言本身强制执行。)< / p>
一些经验法则/指南:
public
。public
。protected
。private
在具体final
类中,只有friends
才能在大多数情况下实例化。在所有情况下,您都会向某个类的相应用户发布通知,而不是向所有类用户发布通知。