我正在从基本的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?
感谢任何帮助!
答案 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)
最后是私有 - 这段代码只是“隐藏”其他类的复制构造函数,这意味着“不要复制我”。
答案 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
因此,您无法将其粘贴到按值调用功能中。