美好的一天,先生们! 让我们考虑一下代码:
class Test
{
int a;
public:
Test(){}
Test( Test& t){cout<<"hello\n";} //copy constructor
Test foo() { return Test();}
};
int main()
{
Test t;
}
问题是给定的代码没有编译。如果我们删除了复制构造函数,一切顺利。问题是什么?添加 const - Test(const Test& t)
解决了这个问题,但我无法理解为什么。有人可以解释一下吗?谢谢!
答案 0 :(得分:3)
Test( Test& t){cout<<"hello\n";}
是的,这个是的复制构造函数。
但是,我们通常这样写:
Test(const Test& t){cout<<"hello\n";}
那是因为远这种方式更有用;这是我们可以从“临时”(例如你的表达式Test
)复制构造Test()
的唯一方法,因为只有引用到const
(和rvalue引用)可以绑定对临时工。
与以下问题相同:
int& r1 = 3; // :(
const int& r2 = 3; // :D
或:
int& r1 = f(); // :(
const int& r2 = f(); // :D