2011-04-18 147 views
0

拷贝构造函数的想法真的让我困惑。我不明白他们为什么使用引用以及为什么在复制构造函数中引用常量?的拷贝构造函数

+0

什么语言您使用的贾森? – preinheimer 2011-04-18 19:52:28

+1

大概是一个C++的问题。你的C++教科书对这个主题有什么要说的? – 2011-04-18 19:52:42

+0

[为什么复制构造函数应该通过C++引用接受它的参数?](http:// stackoverflow。com/questions/2685854/why-copy-constructor-accept-its-parameter-by-reference-in-c) – 2011-04-18 20:23:30

回答

10

为什么使用引用:如果您没有,则必须创建要复制的对象的副本。那必须用拷贝构造函数来完成。在这里插入无限循环。

为什么一个const引用:你想保证你正在复制的对象没有被修改。

[编辑]正如他在评论DeadMG状态,你也想引用是const这样就可以创建一个临时实例的副本。例如。假设你有:

class Matrix 
{ 
    Matrix const operator+ (Matrix const & rhs) const; 
    // Code & stuff 
} 

你想返回值是const,这样愚蠢的事情,如下面的产生编译错误:

Matrix a, b, c; 
(a + b) = c; 

现在很明显,这是一个愚蠢的说法,但如果返回类型从operator+不是const,它实际上是允许的。当然,在下一行中,临时(a + b)将超出范围,您将无法使用它。

然而,正如之前所说的,你要能够与一个临时的实例创建一个实例:

Matrix a, b; 
Matrix c(a + b); 

如果参数拷贝构造函数不是const,那是不可能的,因为operator+的返回类型是const

+2

并且它可以接受对现有C++中临时对象的引用。 – Puppy 2011-04-18 19:59:17

+0

尽管注意C++ 0x移动语义可能会被你的'operator +'冒充,它返回一个const临时值。如果'(a + b)'是常量,则不能移动到另一个“矩阵”,只能复制。 “假设”规则可能仍然可以为您节省昂贵的副本,但IIRC并非在所有情况下。在这方面,移动语义就像在C++ 03中执行'x.swap(a + b)'而不是'x = a + b',但是如果'a + b'是'const',则使用'swap',然后优化不会编译 - 如果移动分配不可能,则使用移动语义,它会回退到复制分配。 – 2011-04-18 23:42:04

+0

糟糕,我的意思是做'(a + b).swap(x)'而不是'x = a + b'。做'x.swap(a + b)'没有多大用处,因为即使非const,'a + b'也不会绑定到非const引用。无论如何,这个要点应该是,即使它是以前的,它不再是“显而易见的”,因为'operator +'应该返回一个const对象。 – 2011-04-18 23:48:17

0

一个C++“引用”类型可以简单地被认为是一个常量指针,它被初始化为一个对象的地址值...换句话说,引用永远不能为NULL,它必须指向一些目的。因此,它也可以由编译器隐式地引用到幕后,因此您不必担心管理指针本身以及关联的指针语法。

因此,使用复制构造函数时,基本上是将常量指针传递给要复制到复制构造函数中的对象......您并未复制该对象本身。如果您确实必须将对象本身复制到临时对象中,然后由复制构造函数使用它来创建新副本,如前所述,最终会出现无限循环,因为会将对象复制到临时对象中对象在第一个地方?另一方面,如果你只是移动一个指针,那么就不需要复制构造函数来获得想要复制到复制构造函数中的对象。虽然使用引用语法而不是实际的常量指针,但是因为1)引用不能为NULL(如果它是指针语法,我们可以将NULL传递给常量指针),并且它的副产品意味着2)很多事情都比较简单,包括语法,因为编译器可以为您传入引用指针的隐式解引用,因此您可以使用普通的成员访问语法,如myclass.member_function()而不是myclass->member_function()

希望这有助于

+0

这看起来像是对一个不同的问题“什么是参考?”的回答。 – 2011-04-18 20:15:04

+0

我只是试图说明他们为什么要使用引用......换句话说,问题被问到的方式,它似乎也问“为什么他们使用引用而不是对象本身?”(或者为此,为什么不是其他类型?)“。如果你首先明白了参考文献的含义,那么当使用参考文献时,推理需要的理由会变得更加清晰。 – Jason 2011-04-18 20:19:12