c++ - 将复制构造函数设置为 private 和 =delete 有什么区别?
问题描述
我看过很多书推荐使用=delete
,这只是清楚它的意思吗?(使程序更具可读性)而不是说将复制构造函数设置为私有是一件坏事?认为你的答案
class A {
A(const A&);
// some functions and variable
public:
// or you can A(const A&)=delete;
// do something
};
解决方案
这是一个相对较新的功能(在 2011 年的 C++ 修订版中添加),其主要动机肯定是可读性和意图清晰。然而,区别不仅仅是化妆品。
请记住,使用类中声明的构造函数,没有什么能阻止其他翻译单元实际提供定义。在头文件中列出类的成员函数并在单独的 .cpp 中实现它们是很常见的。如果有人从类内部使用复制构造函数,编译器会抱怨缺少定义(“未定义的引用...”)。如果一个天真的程序员以某种方式得出结论,即您因为从不需要它而忘记实现它,他们可以继续这样做。突然间,您的类是可复制的,即使只能从它自己的成员函数(和朋友)中复制。这=delete
构造函数可以防止这种情况,并且编译器错误更好(通常沿着“无法复制对象,因为复制构造函数被声明为已删除”而不是“未定义的引用...”或“A::A 是在这种情况下是私有的”)。
推荐阅读
- python - 计算列表中的单词并将值分配给同一数据框中的新列
- facebook - SwiftUI Facebook 登录按钮对话框仍然打开?
- javascript - Javascript仅解析时间字符串并比较它们
- r - 将几列数据框折叠成一个数据框
- reactjs - 映射函数未映射 React 中的数组
- flutter - listview.builder 的返回值
- python - 增强keras文件夹中的所有图像
- c++ - с++ 如何将变量的值传递给结构内的方法?
- c - 如何在长度大于 INT_MAX 或 SIZE_MAX 的字符串中逐个字符地迭代?
- latex - 在单列 Longtable/Supertabular 之前平衡 Latex 双列布局