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

Class Copy Operation, how it works?

本文关键字:工作 何工作 操作 复制      更新时间:2023-10-16

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

QuadTree(const QuadTree &cpy);

例如,假设我还没有填写这个构造函数。只要不使用,代码就可以编译。现在,我有一个名为 subtractTrees 的函数:

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);

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

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

就像由于我的复制构造函数在代码中使用并且尚未填写而发生的错误一样。这是否意味着现在我有一个复制构造函数调用这样的被动函数(减去树(将调用复制构造函数?

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

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

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

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

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

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

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

如果是这样,有没有办法在仍然使用复制构造函数的同时阻止这种情况发生?

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

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

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

如果你想避免在subtractTrees函数中复制,你可以通过引用传递参数:

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