如何将自引用作为参数在C ++中工作?

时间:2016-12-12 14:42:33

标签: c++

我对以下代码感到困惑,我无法弄清楚为什么Test t calcreturn t中的参数会调用Test(Test &t)?任何人都可以帮我说清楚吗?非常感谢!

#include <iostream>
using namespace std;

class Test {
  public:
    Test(int na, int nb) {
        a = na;
        b = nb;
    }

    Test(Test &t) {
        a = t.a + 1;
        b = t.b + 1;
    }

    int getValue() {
        return a + b;
    }

    Test calc(Test t) {
        return t;
    }
  private:
    int a;
    int b;
};

int main() {
  Test t(1, 1);
  cout << t.calc(t).getValue() << endl;
}

1 个答案:

答案 0 :(得分:5)

在第

cout << t.calc(t).getValue() << endl;
        ^^^^^^^^^
           here

您按值传递t,而不是按引用传递(再次查看声明Test Test::calc(Test t)),因此正在复制参数t。副本意味着调用复制构造函数

Test(Test &t)

return t;的相同想法 - 返回的(本地)对象从函数的本地堆栈复制到返回位置目标。

顺便说一下,您可能需要const来复制ctor,

Test(const Test &t)

一般来说,您不想修改源代码。虽然从技术上讲,你可以有一个复制ctor,它将其参数作为非const,参见例如Can a copy-constructor take a non-const parameter?