C++ 将复制构造函数设置为private和=delete之间有什么区别?
我看过很多书推荐使用C++ 将复制构造函数设置为private和=delete之间有什么区别?,c++,C++,我看过很多书推荐使用=delete,这就是它的意思吗?(使程序更具可读性)而不是说将复制构造函数设置为私有是件坏事? 思考你的答案 A类{ A(常数A&); //一些函数和变量 公众: //或者,您可以A(const A&)=删除; //做点什么 }; 这是一个相对较新的功能(在2011年版的C++中添加),其主要动机当然是可读性和意图的清晰性。然而,区别不仅仅是表面上的 请记住,对于类中声明的构造函数,没有任何东西可以阻止其他翻译单元实际提供定义。通常只在头文件中列出类的成员函数,并
=delete
,这就是它的意思吗?(使程序更具可读性)而不是说将复制构造函数设置为私有是件坏事?
思考你的答案
A类{
A(常数A&);
//一些函数和变量
公众:
//或者,您可以A(const A&)=删除;
//做点什么
};
这是一个相对较新的功能(在2011年版的C++中添加),其主要动机当然是可读性和意图的清晰性。然而,区别不仅仅是表面上的
请记住,对于类中声明的构造函数,没有任何东西可以阻止其他翻译单元实际提供定义。通常只在头文件中列出类的成员函数,并在单独的.cpp中实现它们。如果有人从类内部使用复制构造函数,编译器将抱怨缺少定义(“对…的未定义引用”)。如果一个天真的程序员不知何故得出这样的结论:您忘记实现它是因为您从来都不需要它,那么他们可以继续这样做。突然间,你的类是可复制的,即使只是从它自己的成员函数(和朋友)中。
=delete
构造函数可以防止这种情况,编译器错误也会更好(通常是“由于复制构造函数被声明为已删除,因此无法复制对象”,而不是“未定义对…”的引用”或“A::A在此上下文中是私有的”)您问的是default
,那么这个问题没有太多意义(或者答案很快):一个具有不可访问副本的类是不可复制的,一个具有默认副本的类是不可复制的。你确定你的意思不是像原版那样删除吗?我糟糕的英语…我会修改我的问题。对不起,你的帖子中也有拼写错误。