【问题标题】:copy-constructor related question (native c++) [duplicate]复制构造函数相关问题(本机 C++)[重复]
【发布时间】:2011-08-29 12:03:51
【问题描述】:

可能重复:
Why should the copy constructor accept its parameter by reference in C++?

我知道复制构造函数必须有一个引用作为参数,以避免对其自身进行“无限次调用”。我的问题是 - 为什么会发生这种情况,其背后的逻辑是什么?

CExample(const CExample& temp)
{
   length = temp.length;
}

【问题讨论】:

  • 你有什么问题?请更加努力地问一些精确的问题。
  • 我的意思是为什么会发生无限循环?
  • 你在说什么无限循环
  • 一个无限循环,如果参数传递给 copy constr。不是参考 ---> (const CExample temp)
  • @Niello,那不是循环,那是递归。术语循环用于循环:for(;;){}、while(){}、do{}while()。

标签: c++ class syntax copy-constructor


【解决方案1】:

假设您对副本 C'tor 的参数是按值传递的,那么 C'tor 会做的第一件事就是复制参数 [这就是每个函数,包括构造函数对按值参数所做的事情]。为此,它必须再次调用 C'tor,从原始变量到局部变量……[一遍又一遍……],最终将导致无限循环。

【讨论】:

  • "如果类 X 的第一个参数是 X&、const X&、volatile X& 或 const volatile X&,[...] 类型,则类 X 的非模板构造函数是复制构造函数甚至没有复制ctor ...
  • @PlasmaHH:我的回答中的第一个词是“假设”。当他问“它背后的逻辑是什么”时,OP 提出假设性问题,“如果”
【解决方案2】:

C++ 中有时会调用复制构造函数。其中之一是当您拥有类似的功能时

void f(CExample obj)
{
    // ...
}

在这种情况下,当您拨打电话时

CExample x;
f( x );

CExample::CExample 被调用以从 x 构造 obj

如果您有以下签名

void f(CExample &obj)
{
     // ...
}

(注意 obj 现在是通过引用传递的),复制构造函数 CExample::CExample 不会被调用。

如果您的构造函数接受按值复制的对象(如第一个示例中的函数f),编译器将必须调用复制构造函数首先才能创建一个副本(再次与函数f 一样),但是...哎呀,我们必须调用复制构造函数才能调用复制构造函数。这听起来很糟糕,不是吗?

【讨论】:

    【解决方案3】:

    See here

    “这是一个引用,因为值参数需要进行复制,这将调用复制构造函数,该复制构造函数将对其参数进行复制,该参数将调用复制构造函数,其...”

    或者以不同的方式将值参数传递给构造函数将不得不调用构造函数来复制参数中的值。这个新的构造函数需要做同样的事情——导致无限递归!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 2016-12-19
      • 2013-09-15
      • 1970-01-01
      • 2011-05-29
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多