S复制构造函数

s copy constructor

本文关键字:构造函数 复制      更新时间:2023-10-16

复制构造函数的概念真的让我很困惑。我不明白为什么他们使用引用,为什么在复制构造函数常数引用?

使用引用的原因:如果不使用引用,就必须创建要复制的对象的副本。这必须通过复制构造函数来完成。此处插入无限循环

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

[Edit]正如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

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

所以对于复制构造函数,你基本上是传递一个常量指针到你要复制的对象到复制构造函数…你不是在复制对象本身。如果您必须将对象本身复制到一个临时对象中,然后由复制构造函数使用该对象创建一个新的副本,如前所述,您最终会遇到一个无限循环,因为首先是什么将对象复制到临时对象中呢?另一方面,如果只是移动指针,则不需要复制构造函数来获取要复制到复制构造函数中的对象。使用引用语法而不是实际的常量指针,因为1)引用不能为NULL(如果是指针语法,我们可以将NULL传递给常量指针),这样做的副产品意味着2)很多事情都更简单,包括语法,因为编译器可以为您执行传入的引用指针的隐式解引用,因此您可以使用正常的成员访问语法,如myclass.member_function()而不是myclass->member_function()

希望有帮助,

杰森