我从一个基本的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。工厂通常会隐藏对象构造函数,并在为您构建对象之前需要一些其他属性/注册。
- const,因为您没有修改正在复制的对象
- 安培数表示参考
- 方法声明中不允许使用参数名称,因为只有类型才重要,而不是名称
最后是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
因此,您将无法将其粘贴到按值调用函数中。