要禁止编译器自动提供的功能,请声明 相应的成员函数私有,并给予否定 然后,如果有人无意中打电话给他们,他们会 在链接时收到错误。
我试图编写一个示例程序来实现Scott试图解释的内容。即使成员函数被声明为public
并且没有给出实现,我也可以实现相同的目标。当我试图从另一个对象初始化一个对象时,我的情况也发生了链接错误。所以我不明白为什么Scott强调需要声明成员函数private
?
我的示例程序如下:
#include <iostream>
using namespace std;
class Unique
{
private:
int num;
public:
Unique(int x)
{
num = x;
}
Unique(const Unique &obj);
Unique& operator =(const Unique &obj);
void disp(void)
{
cout << "num = " << num << "\n";
}
};
int main()
{
Unique ob1(3);
Unique ob2(ob1);
ob1.disp();
ob2.disp();
return 0;
}
我收到以下链接错误:
/tmp/ccXfqSqE.o(。text + 0x135):在函数
main': : undefined reference to
中:Unique :: Unique(Unique const&amp;)'collect2:ld返回1 退出状态
答案 0 :(得分:10)
编译器错误比链接错误更清晰,更早发生(这在从大量源文件编译的大型项目中更为明显)。它们在大多数情况下也更容易阅读。声明成员私有会引发编译错误,因此优先于将成员保留为undefined以禁止它们。
正如Baptiste指出的那样,在C ++ 11中,有更好的删除关键字可用于禁止编译器生成的成员:
class A
{
A(constA&) = delete; // copy construction is not allowed
};
答案 1 :(得分:2)
如果你将它们声明为私有,那么编译器会在检测到有人试图调用它们时立即停止,而不管该函数是否实际定义(因为它们是不允许的)。
通过声明它们是公开的,你必须等到链接器阶段才能得到你的错误,因为它应该是一个合法的调用但是缺少定义。
答案 2 :(得分:2)
Scott试图阻止某人调用构造函数并在链接时获取错误。这正是您遇到的情况。在编译时发现问题比在链接时发现问题更便宜。
顺便说一下,使用C ++ 11,我们知道有正式的方法阻止编译器为我们生成函数。
class Unique{
public:
Unique() = delete;
}