禁用由c++编译器自动提供的功能
Disallow functionality automatically provided by C++ compilers
Scott Meyers在他的《Effective c++》一书中说,
要禁用编译器自动提供的功能,请声明对应的成员函数private和give no实现。如果有人不小心打了电话,他们就会在链接时得到错误。
我试着写一个示例程序来实现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): In function
main': : undefined reference to
Unique::Unique(Unique constate &)' collect2: ld返回1退出状态
编译器错误比链接错误更清晰,更早发生(这在从大量源文件编译的大型项目中更为明显)。大多数时候,它们也更容易阅读。将成员声明为private会引发编译错误,因此比不定义成员来禁止它们更可取。
正如Baptiste所指出的,在c++ 11中,有一个更好的delete关键字可用于禁止编译器生成的成员:
class A
{
A(constA&) = delete; // copy construction is not allowed
};
如果您声明它们为private,那么编译器将在检测到有人试图调用它们时立即停止,而不管函数是否实际定义(因为它们是不允许的)。
通过将它们声明为public,那么你必须等到链接器阶段才能得到错误,因为它应该是一个合法的调用,但是缺少定义。
Scott试图阻止某人调用构造函数并在链接时得到错误。这正是你所遇到的情况。在编译时发现问题比在链接时发现问题更便宜。
顺便说一下,在c++ 11中,我们知道有官方的方法来防止编译器为我们生成函数。
class Unique{
public:
Unique() = delete;
}
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?