禁止C++编译器自动提供的功能

nit*_*ian 3 c++ constructor operator-overloading access-specifier implicit-conversion

Scott Meyers在他的书"Effective C++"中说,

要禁止编译器自动提供的功能,请将相应的成员函数声明为private并且不执行任何实现.然后,如果有人无意中调用了一个,则会在链接时出现错误.

我试图编写一个示例程序来实现Scott试图解释的内容.即使声明了成员函数public并且没有实现,我也可以实现相同的目标.当我试图从另一个对象初始化一个对象时,我的情况也发生了链接错误.所以我不明白为什么斯科特强调要宣布成员函数的需要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;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下链接错误:

/tmp/ccXfqSqE.o(.text+0x135):在函数main': : undefined reference toUnique :: Unique(Unique const&)'collect2:ld返回1退出状态

Pet*_* G. 10

编译器错误比链接错误更清晰,更早发生(这在从大量源文件编译的大型项目中更为明显).它们在大多数情况下也更容易阅读.声明成员私有会引发编译错误,因此优先于将成员保留为undefined以禁止它们.

正如Baptiste指出的那样,在C++ 11中,有更好的删除关键字可用于禁止编译器生成的成员:

class A
{
     A(constA&) = delete; // copy construction is not allowed
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在C++ 11中,您使用delete关键字来确保不使用构造函数或函数. (3认同)