具有未命名参数的私有拷贝构造函数?

时间:2013-11-26 23:39:59

标签: c++ pointers constructor ampersand

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

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

我理解指针,我也检查过:Ampersand & with const in constructor。显然它是一个(硬)复制构造函数,但我不明白,这是如何工作的?为什么const?为什么最后没有var名称的&符?私人为什么?我没有在我的书或cplusplus.com中找到这样的例子。

旁注:

int foo(int var)  { cout << var; }
int bar(int &var) { cout << var; }
foo和bar打印相同的东西? bar本质上是打印*&amp; var?

感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

工作。这里的操作词是private。整个构造的作用是创建一个只能从成员函数调用的复制构造函数,从而有效地禁用该行为。通常人们会遗漏函数体,因此如果从成员函数中调用它,也会出现链接错误。

在C ++ 11中,这将实现为

CPU(const CPU&) = delete;

如果你真的试图诱导它:

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

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

他们之所以这样做是因为他们希望禁用功能 - 您无法使用复制构造函数创建其中一个对象。

“const CPU&amp;”表示“引用const CPU”。省略变量名是合法的,因为函数从不引用它,但它必须匹配参数 pattern

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

  1. const因为您没有修改要复制的对象
  2. &符号表示参考
  3. 方法声明中不允许使用参数名称,因为只有类型有关,而不是名称
  4. 最后是私有 - 这段代码只是“隐藏”其他类的复制构造函数,这意味着“不要复制我”。

答案 3 :(得分:0)

这是一种阻止你(意外)通过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

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