复制构造函数的想法真让我困惑。我不明白为什么他们使用引用以及为什么在复制构造函数中使用常量引用?
答案 0 :(得分: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
。
答案 1 :(得分:0)
C ++"参考" type可以简单地被认为是一个常量指针,它被初始化为一个对象的地址值...换句话说,一个引用永远不能是NULL,它必须指向某个对象。因此,编译器也可以在幕后隐式取消引用,因此您不必担心管理指针本身以及相关的指针语法。
因此,使用复制构造函数,您基本上是将一个常量指针传递给您正在复制到复制构造函数中的对象......您不会复制对象本身。如果你必须将对象本身复制到一个临时对象中,然后由复制构造函数用来创建一个新副本,如前所述,你最终会得到一个无限循环,因为将对象复制到临时对象在第一位?另一方面,如果您只是移动指针,则不需要复制构造函数来获取要复制到复制构造函数的对象。使用引用语法而不是实际的常量指针,因为1)引用不能为NULL(如果它是指针语法,我们可以将NULL传递给常量指针),并且这意味着副产品2)很多东西都比较简单,包括语法,因为编译器可以为你进行传入的引用指针的隐式解引用,所以你可以使用普通的成员访问语法,如myclass.member_function()
而不是{{1 }}
希望这有帮助,
杰森