提问人:madina11906036 提问时间:9/11/2021 更新时间:9/11/2021 访问量:340
无法使用函数的返回值初始化对象。.为什么?[复制]
Cannot initialize object with returning value of a function.. Why? [duplicate]
问:
我编写了这个简单的代码来了解 c++ 中复制构造函数的功能。当我直接用“obj1”初始化“obj2”时,它工作正常。但是当我尝试使用函数“func()”的返回对象初始化“obj2”时,它显示错误:
错误:无法将类型为“MyInt&”的非常量左值引用绑定到类型为“MyInt”的右值
为什么会这样?
法典:
#include<bits/stdc++.h>
using namespace std;
class MyInt
{
int x;
public:
MyInt()
{
cout<< "default constructor called" << endl;
}
MyInt(int x)
{
cout<< "constructor with initializer called" << endl;
this->x = x;
}
MyInt(MyInt& obj) {
this->x = obj.x;
cout<< "copy constructor called" << endl;
}
~MyInt()
{
cout<< "destructor called" << endl;
}
};
MyInt func(MyInt obj)
{
return obj;
}
int main()
{
MyInt ob1(2);
//MyInt ob2 = ob1; //works perfectly fine: "copy constructor called"
MyInt ob2 = func(ob1); //giving error
}
答:
1赞
Drew Dormann
9/11/2021
#1
您已经定义了这个构造函数:
MyInt(MyInt& obj) {
this->x = obj.x;
cout<< "copy constructor called" << endl;
}
该参数是引用,它不是 .MyInt& obj
const
这表明您希望能够读取和写入它。
C++ 将通过不允许将临时(也称为“右值”)作为此参数传递来保护您免受某些错误的影响。因为写信给临时工几乎可以肯定是一个错误。无论你写什么都会丢失。
但是,您的函数不会写入该参数。您可以通过使 .const
MyInt(const MyInt& obj) {
this->x = obj.x;
cout<< "copy constructor called" << endl;
}
此更改将允许将临时对象传递给此构造函数。
评论
MyInt(MyInt& obj)
MyInt(const MyInt& obj)
func()
MyInt&