先生们,美好的一天! 让我们考虑一下代码:
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)
解决了问题,但我不明白为什么。有人可以解释一下吗?谢谢!
最佳答案
Test( Test& t){cout<<"hello\n";}
是的,这是一个复制构造函数。
不过,我们通常是这样写的:
Test(const Test& t){cout<<"hello\n";}
那是因为这种方式远更有用;这是我们可以从“临时”(例如您的表达式 Test()
)复制构造 Test
的唯一方法,因为只有 references-to-const
(和右值引用)可以绑定(bind)到临时对象。
与下面的问题相同:
int& r1 = 3; // :(
const int& r2 = 3; // :D
或:
int& r1 = f(); // :(
const int& r2 = f(); // :D
关于c++ - 从方法中按值返回类类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28242521/