C++ C++;编译器警告-返回局部变量
我只是试图重载一个+运算符,我得到了这个编译器警告C++ C++;编译器警告-返回局部变量,c++,C++,我只是试图重载一个+运算符,我得到了这个编译器警告 reference to local variable 'tmp' returned 这是重载的代码 const Int& Int::operator+(const Int& p) const { Int tmp = value + p.value; return tmp; } 这是上课时间 class Int{ int value; public: Int() {} // defaul
reference to local variable 'tmp' returned
这是重载的代码
const Int& Int::operator+(const Int& p) const
{
Int tmp = value + p.value;
return tmp;
}
这是上课时间
class Int{
int value;
public:
Int() {} // default constructor
Int(int v) : value(v) {}
Int& operator=(const Int&);
const Int& operator+(const Int&) const;
};
不能返回对局部变量的引用。在
操作符+()
函数中,您正在创建一个名为tmp
的局部变量。一旦函数退出,它就会被销毁。您不能返回对该变量的引用,因为当调用函数获取返回值时,该变量不再存在
将函数的定义更改为:
const Int operator+(const Int&) const;
它将在没有警告的情况下构建,并且工作正常。您尝试的是返回对内存位置的引用,该引用在返回时将无效 变量tmp将在超出范围时消失(即运算符+完成时) 因为您的返回类型是Int&,所以在“returntmp”处返回的不是tmp的值,而是对tmp的引用。这是不正确的,因为tmp在方法完成后将不再存在
解决方案:不要作为引用返回,但作为Int
tmp
的存储类为auto
,退出时将消失。答案是指定静态
static Int tmp = value + p.value;
分配给
tmp
的存储将在程序执行期间保留。请注意,此解决方案的一个严重副作用是,任何后续调用operator+()都将覆盖“tmp”保留的先前值。这是目前为止我能想到的最糟糕的解决方案。你不认为“const”也应该删除,以避免多余的副本吗?