具有未定义参数的私有副本构造函数
Private copy constructor with unamed argument?
我从一个基本的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
因此,您将无法将其粘贴到按值调用函数中。
- 如何从构造函数副本 T(const T&)调用对象 T?
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 复制构造函数生成旧数组的错误副本
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 是否可以编写便于副本初始化的显式构造函数
- 该代码调用副本或移动构造函数
- 我应该声明我的异常的副本构造函数noexcept吗
- 复制构造函数不起作用,无法修改副本
- C++中的构造函数副本、列表、指针和模板
- 具有未定义参数的私有副本构造函数
- 构造函数初始化列表中的 C 结构副本C++
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 错误的数组初始化与赋值副本构造函数初始化
- 如何制作此构造函数的深层副本
- 为二进制搜索树副本构造函数编写辅助函数
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 模拟虚拟副本构造函数
- 模板化构造函数可以代替已删除的副本构造函数吗
- 在编译器生成的副本构造函数之上强制使用模板化构造函数
- 了解虚拟副本构造函数