不要返回局部對象的引用

在一個函數返回值爲引用時,千萬不要返回局部變量的引用。

看下面的例子:

class Data
{
Public:
    Data();
    ~Data();

    float& getTolerance();

Private:
    float mTolerance;
};

在實現這個類的成員函數getTolerance時,如果用下面方式實現:

float& Data::getTolerance()
{
    float addTolerance = 2.0f;
    return addTolerance;
}

上面這種方式爲導致錯誤的結果。 因爲局部對象是在被定義時創建,在離開生命空間時被銷燬的。所謂生命空間,是指它們所在的函數體。當函數返回時,程序的控制離開了這個空間,所以函數內部所有的局部對象被自動銷燬。因此,如果返回局部對象的引用,那個局部對象其實已經在函數調用者使用它之前被銷燬了。 也就是說,在離開函數getTolerance()後, addTolerance 會被自動銷燬。
但是可以使用類成員變量的引用, 如下所示:

float& Data::getTolerance()
{
    return mTolerance;
}

注意: 雖然引用有很多好處,可以提高效率,但是在使用引用作爲返回值時,一定要謹慎,否則會導致一些未知的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章