【问题标题】:Copy constructor and assignment operator both get called复制构造函数和赋值运算符都被调用
【发布时间】:2012-01-01 17:34:33
【问题描述】:

我有以下程序sn-p:

Polynomial Polynomial:: add(const Polynomial b)
{
    Polynomial c;
    c.setRoot(internalAdd(root, c.root));
    c.setRoot(internalAdd(b.root, c.root));
    return c;
}

c = (a.add(b));

据我了解,此代码假设将 a 和 b 相加,然后通过调用复制构造函数将生成的多项式分配给 c。

然而,当我实际测试它时,

  • c 立即调用复制构造函数并尝试复制 b,
  • 然后a和b相加
  • 然后 c 尝试通过赋值运算符得到结果多项式
  • 然后程序崩溃

我能做些什么来解决这个问题?

【问题讨论】:

  • 您需要向我们展示复制构造函数和赋值运算符来检测崩溃的原因。顺便说一句,您看到的行为或多或少是可解释的查找命名返回值优化(NRVO)。
  • 运营商关键字标签?你想写Polynomial::operator +(const Polynomial& rhs) const吗?

标签: c++ constructor copy variable-assignment operator-keyword


【解决方案1】:
Polynomial Polynomial::add(const Polynomial& b)
                                           ^

如果您不想复制参数,请将其作为参考传递,如上所述。

这可能无法解决您的崩溃问题 - 如果没有更多代码(以及您身边的一些调试以查明它),就无法判断是什么原因造成的,但它将消除复制构造多项式参数的需要.

【讨论】: