Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不允许C+自动提供的功能+;编译程序_C++_Constructor_Operator Overloading_Implicit Conversion_Access Specifier - Fatal编程技术网

C++ 不允许C+自动提供的功能+;编译程序

C++ 不允许C+自动提供的功能+;编译程序,c++,constructor,operator-overloading,implicit-conversion,access-specifier,C++,Constructor,Operator Overloading,Implicit Conversion,Access Specifier,Scott Meyers在他的《高效C++》一书中说 若要禁止编译器自动提供的功能,请声明 相应的成员函数为private,不提供 如果有人无意中调用了一个,他们会 在链接时获取错误 我试图编写一个示例程序来实现Scott试图解释的内容。即使成员函数被声明为public,并且没有实现,我也可以实现同样的功能。在我的例子中,链接错误也是在我试图从另一个对象初始化一个对象时发生的。所以我不明白为什么Scott强调成员函数需要声明为私有的 我的示例程序编写如下: #include <iostre

Scott Meyers在他的《高效C++》一书中说

若要禁止编译器自动提供的功能,请声明 相应的成员函数为private,不提供 如果有人无意中调用了一个,他们会 在链接时获取错误

我试图编写一个示例程序来实现Scott试图解释的内容。即使成员函数被声明为
public
,并且没有实现,我也可以实现同样的功能。在我的例子中,链接错误也是在我试图从另一个对象初始化一个对象时发生的。所以我不明白为什么Scott强调成员函数需要声明为私有的

我的示例程序编写如下:

#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;
}
#包括
使用名称空间std;
类唯一
{
私人:
int-num;
公众:
唯一(整数x)
{
num=x;
}
唯一(const Unique&obj);
唯一和运算符=(常量唯一和对象);
作废显示(作废)
{

cout编译器错误比链接错误更清晰,发生得更早(这在从大量源文件编译的大型项目中更明显)。大多数时候,它们也更容易读取。将成员声明为私有会引发编译错误,因此,与保留未定义的成员相比,更倾向于禁用它们

正如巴蒂斯特所指出的,在C++11中,有一个更好的delete关键字用于禁止编译器生成的成员:

class A
{
     A(constA&) = delete; // copy construction is not allowed
};

如果您将它们声明为private,那么编译器将在检测到有人试图调用它们时立即停止,而不管函数是否实际定义(因为它们是不允许的)


通过将它们声明为公共,您必须等到链接器阶段才能获得错误,因为它应该是合法调用,但缺少定义。

Scott试图阻止有人在链接时调用构造函数并获得错误。这正是您遇到的情况。在编译时发现问题更便宜比在链接时间

顺便说一句,使用C++11,我们知道有官方的方法来防止编译器为我们生成函数

class Unique{
public:
    Unique() = delete;
}

注意,在C++11中,使用delete关键字来确保未使用构造函数或函数。