类复制操作,它是如何工作的?

时间:2012-05-10 04:16:22

标签: c++ constructor copy

我有一个名为QuadTree的课程。我最近为它创建了一个复制构造函数,即:

QuadTree(const QuadTree &cpy);

比如说我还没有填写这个构造函数。只要它不使用,代码将编译得很好。现在,我有一个名为subtractTrees的函数:

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);

在制作复制构造函数之前,这段代码运行得很好。现在使用此函数编译程序时出现以下错误:

Undefined Referance to QuadTree::QuadTree(QuadTree const&)

由于我的复制构造函数在代码中使用但尚未填写,因此会发生错误。这是否意味着现在我有一个复制构造函数调用这样的被动函数(subtractTrees)将调用复制构造函数?

如果有这样的方法可以阻止这种情况发生,同时仍然使用复制构造函数?我需要这样做的原因是复制用于这样的函数将大大减慢我的代码。但我需要复制构造函数来轻松复制树。

编辑:我只是通过填写复制构造函数来修复错误,但问题更多是关于

  1. 如果没有复制构造函数,它是如何工作的。
  2. 如果有人试图通过每次使用时不复制树来节省速度,有没有办法利用这种不需要的复制构造函数?

2 个答案:

答案 0 :(得分:4)

您必须为您的类QuadTree定义一个构造函数,当您这样做时,编译器不会生成隐式复制构造函数,它假定您将在需要时提供自己的构造函数。

当您添加按值QuadTree类型的函数时,需要复制构造函数来执行这些副本,因此编译器会抱怨。

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
                         ^^^^^^^^^^^^  ^^^^^^^^^^^^^

按值传递需要复制构造函数。

如果有这样的方法可以在仍然使用复制构造函数的情况下阻止这种情况发生?

我不确定我理解这个问题。如果要创建类对象的副本,则需要复制构造函数。如果你想避免副本通过const引用传递你的对象。

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);

答案 1 :(得分:1)

当你没有声明复制构造函数时,编译器会隐式地为你提供一个,这就是你的代码以前工作的原因。由于您将QuadTree的值传递给subtractTrees,因此在声明自己的复制构造函数之前,会调用此隐式复制构造函数。一旦您声明(但没有定义)您自己的复制构造函数,编译器就会隐式定义一个复制构造函数,因此所有先前对复制构造函数的调用(例如在您的subtractTrees函数中)都会生成未定义的引用。

如果您想避免subtractTrees功能中的副本,您可以通过引用传递参数:

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);