2009-08-20 79 views
14

我只是想超载+运营商,我得到这个编译器警告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() {} // default constructor 
    Int(int v) : value(v) {} 
    Int& operator=(const Int&); 
    const Int& operator+(const Int&) const; 
}; 

回答

15

您不能返回对局部变量的引用。在operator+()函数内部,您正在创建一个名为tmp的局部变量。一旦函数退出,它就会被销毁。您无法返回对该变量的引用,因为调用函数获取返回值时它不再存在。

你定义的函数更改为:

const Int operator+(const Int&) const; 

这将建立一个没有警告和工作也没关系。

7

你试图做的是返回一个引用到一个内存位置,当你返回它时将会失效。

当变量tmp超出范围时(即操作符+完成时),变量tmp将消失。

由于您的返回类型为Int &,因此tmp的值不是在“return tmp”返回,而是对tmp的引用。这是不正确的,因为方法完成后tmp将不再存在!

解决方案:不要回来作为参考,但为INT

0

tmp具有存储类auto当我们退出就会消失。答案是指定静态。

static Int tmp = value + p.value; 

分配给tmp的存储将在程序期间保留。