我对以下代码感到困惑,我无法弄清楚为什么Test t
calc
和return 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;
}
答案 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?