具有未定义参数的私有副本构造函数



我从一个基本的CPU模拟器中读取了一些C++代码,但我无法理解:

class CPU {
private:
    CPU (const CPU&){}
};

我理解指针,我也检查了一下:Ampersand&构造函数中带有const。显然,它是一个(硬拷贝)构造函数,但我不明白,这是如何工作的?为什么是const?为什么最后的"与"和没有var名称?为什么是私人的?我在我的书或cplusplus.com.中还没有找到这样的例子

附带说明:

int foo(int var)  { cout << var; }
int bar(int &var) { cout << var; }

foo和bar打印相同的东西?条形图本质上是在打印*&var?

感谢您的帮助!

不起作用。这里的关键词是private。整个构造所做的是创建一个只能从成员函数调用的复制构造函数,从而有效地禁用了该行为。通常情况下,人们会忽略函数体,这样如果从成员函数调用它,也会出现链接错误。

用C++11的说法,这将被实现为

CPU(const CPU&) = delete;

如果你真的试图诱导它:

CPU x;
CPU y(x); // this is the one that matches the parameters

你会得到一个编译器错误,因为你不是成员函数,但你试图调用一个私有函数。

他们之所以这么做,是因为他们想禁用功能——你不能使用复制构造函数创建其中一个对象。

"const CPU&"的意思是"引用const CPU"。省略变量名是合法的,因为函数从不引用它,但它必须与参数模式匹配。

&表示在参数定义中使用时通过引用传递。这会将参数转换为指针,并在函数范围内使用该指针时取消引用该指针。在第二个问题中,两个函数都打印相同的内容,因为&只是说通过引用传递原始对象,而不是将其复制到函数头中。存在相同的内容,唯一的区别是其中一个函数复制完整的输入,另一个函数可以编辑源变量(如果需要的话)

CPU (const CPU&){}表示构造函数需要对CPU对象的常量引用。这意味着您只能访问CPU的const函数(并确保您不会更改原始CPU对象参数)。在CPU&之后没有名称只意味着您没有将变量分配给当前范围内的名称(也就是说,定义后面的括号将忽略参数)。

当构造函数是私有的时,通常意味着有另一个函数将为您生成Object。工厂通常会隐藏对象构造函数,并在为您构建对象之前需要一些其他属性/注册。

  1. const,因为您没有修改正在复制的对象
  2. 安培数表示参考
  3. 方法声明中不允许使用参数名称,因为只有类型才重要,而不是名称

最后是private——这段代码只是从其他类中"隐藏"复制构造函数,意思是"不要复制我"。

这是一种防止您(意外)通过e.q将类实例的副本传递给函数来创建实例副本的方法:

CPU foo;
void f1(CPU &foo) {}; f1(foo);  // work
void f2(CPU *foo) {}; f2(&foo); // work
void f3(CPU foo)  {}; f3(foo);  // fails

因此,您将无法将其粘贴到按值调用函数中。

最新更新