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

C++ 类复制操作,它是如何工作的?,c++,constructor,copy,C++,Constructor,Copy,我有一个叫做四叉树的类。我最近为它创建了一个副本构造函数,即: QuadTree(const QuadTree &cpy); 比如说,我还没有填写这个构造函数。只要不使用它,代码就可以正常编译。现在,我有一个名为subtract trees的函数: QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS); 在创建复制构造函数之前,这段代码工作得很好。现在,使用此函数编译程序时,出现以下错误: Undefined Referance t

我有一个叫做四叉树的类。我最近为它创建了一个副本构造函数,即:

QuadTree(const QuadTree &cpy);
比如说,我还没有填写这个构造函数。只要不使用它,代码就可以正常编译。现在,我有一个名为subtract trees的函数:

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
在创建复制构造函数之前,这段代码工作得很好。现在,使用此函数编译程序时,出现以下错误:

Undefined Referance to QuadTree::QuadTree(QuadTree const&)
由于代码中使用了我的复制构造函数,并且尚未填写,因此会发生错误。这是否意味着现在我有了一个复制构造函数,对像这样的被动函数的调用(subtractTrees)将调用复制构造函数

如果是这样,在仍然使用复制构造函数的情况下,是否有方法阻止这种情况发生?我需要这样做的原因是,在这样的函数中使用复制将大大降低我的代码速度。但是我需要复制构造函数来轻松复制树

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

  • 没有复制构造函数,它是如何工作的
  • 如果一个人试图通过每次不复制树来节省速度,那么有没有一种方法可以利用这种无需复制的构造函数

  • 您必须为类定义构造函数
    四叉树
    ,当您这样做时,编译器不会生成隐式复制构造函数,它假定您将提供自己的构造函数(如果需要)

    当您添加函数时,需要一个复制构造函数来执行这些复制,因此编译器会抱怨

    QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
                             ^^^^^^^^^^^^  ^^^^^^^^^^^^^
    
    传递值需要复制构造函数

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

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

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

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

    如果要避免在
    subtract trees
    函数中复制,可以通过引用传递参数:

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

    那么,如果我必须填写它,并承受可能缓慢的后果,那么在没有复制构造函数的情况下,代码以前是如何工作的呢?@Ben:假设填充意味着提供一个定义,您的代码以前工作过,因为在提供新函数之前,您的代码不需要在任何地方调用复制构造函数。@我可能对问题的措辞有误,减法函数工作得很好,没有生成复制构造函数。如果您需要一个副本来传递值,这怎么可能呢?我已经填写了副本构造函数,它工作得很好,但是如果我非常渴望速度,我仍然有兴趣知道是否有办法使用它。@Ben:答案的第一段解释道。检查第二个查询的更新答案。