2013-11-26 30 views
2

我是从一个基本的CPU仿真器阅读一些C++代码,我只是不明白这一点:私有拷贝构造函数与unamed参数?

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打印同样的事情?酒吧本质上是印刷* & var?

任何帮助表示赞赏!

回答

1

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

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

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

+0

因此,可以使用私人副本构造函数来控制实例的数量并防止复制实例?有趣。谢谢。 – ShadoWalkeR

0
  1. 常量,因为你不修改要复制
  2. 符号的对象是指参考
  3. 没有参数的名称是允许在方法声明,因为只有类型的问题,不是名称

最后是私有的 - 这个代码只是“隐藏”从其他类复制构造函数,这意味着“不要复制我”。

3

不是工作。这里的操作词是private。整个构造所做的是创建一个只能从成员函数调用的复制构造函数,从而有效地禁用该行为。通常人们会忽略掉函数体,这样如果你从成员函数调用它,你也会得到一个链接错误。

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

CPU(const CPU&) = delete; 

如果你真的想说服它:

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

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

他们这样做的原因是因为他们想要禁用的功能 - 您无法使用复制构造函数创建这些对象中的一个。

“const CPU &”表示“引用常量CPU”。将变量名放在合法的位置是合法的,因为该函数不会引用它,但它必须与参数模式匹配。

+0

实际上,如果其他CPU方法使用拷贝构造函数,它就可以工作(虽然这不可能是这种情况) – Pyrce

+0

@Pyrce:这就是为什么通常没有定义身体的原因。所以,如果意外使用,那么你会得到一个链接器错误。但这就是为什么'= delete'更好,因为你不必记住不定义它。 –

+0

你是什么意思,它不起作用?它似乎是现有项目中的代码,并且大多数C++项目仍然以C++ 03编写最好的案例,这是从其他类隐藏拷贝构造函数的方式。 –

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 

所以,你将无法通过值功能,把它粘贴到电话。