2013-09-21 97 views
15
class A 
{ 
public: 
    A() = default; 
    A(const A&) = delete; 
}; 

class A 
{ 
public: 
    A() = default; 

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

这两个定义在任何情况下总是相同吗?必须删除一个构造函数是否是私有的?

+9

我公开我的删除功能,因为它是**向公众用户发布的公告,它不能默认构建(在你的情况下)。 – Nawaz

回答

26

它们不同只有生成的诊断。如果你把它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

+5

+1。我公开我的已删除函数,因为它是向公众用户发布的公告**,它不能被默认构建(在OP的情况下)。 – Nawaz

+3

@Nawaz对,因此它也可以被认为是类的接口/文档的一部分。 –

2

我想扩展Daniel Frey's answer。而不是删除方法总是public,我宁愿给这些方法访问修饰符你会(假设)给这些方法,如果他们不会被删除。 (我不喜欢总是的情况下,程序员有一个选项,如果它确实会在石头上,使删除方法public,它应该由语言本身来执行雕刻。)

的拇指/准则某些规则:

  • 复制和移动赋值运算符将在具象与抽象类public在大多数情况下
  • 复制和移动构造函数将为public在具体类大多数情况下
  • 对于大多数情况下复制和移动构造函数将在protected抽象类
  • 复制和移动构造将是一个只能通过friends在大多数情况下被实例化具体finalprivate

在任何情况下,您都会向类的相应用户发布通告,而不是某个类的所有用户。

相关问题