2009-08-20 47 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的存儲將在程序期間保留。