日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

提高C++代码质量 - [083]不要返回局部变量的引用

發布時間:2025/6/15 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 提高C++代码质量 - [083]不要返回局部变量的引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述:不要返回局部變量的引用,也不要返回new生成的對象的引用。

?

寫一個復數類CComplex,支持復數的加法,代碼如下:

class CComplex

{

public:

????CComplex(float real = 0, float imagin = 0)

????????: m_real(real), m_imagin(imagin){}

????~CComplex(){}

private:

????float m_real;

????float m_imagin;

?

????friend const CComplex& operator +(const CComplex& lhs, const CComplex& rhs);

};

?

inline const CComplex& operator +(const CComplex& lhs, const CComplex& rhs)

{

????CComplex result(lhs.m_real + rhs.m_real, lhs.m_imagin + rhs.m_imagin);

????return result;

}

?

//用戶使用代碼

CComplex a(1.02f, 3.21f);

CComplex b(7.10f, 5.44f);

CComplex c = a + b;

const CComplex& d = a + b;

?

上面的代碼雖然在VS2010中可以運行通過,但是會有一個警告:

warning C4172:返回局部變量或臨時變量的地址

那么,到底發生了什么呢?

首相,構造了一個局部變量result,接著生成result的別名,并作為函數的返回值返回,賦值給外面的臨時變量,最后局部變量超出生命周期銷毀。而此時result的別名還存在,所以警告就產生了。

需要注意的是,在C++標準中,這樣做的結果是未知的。之所以在VS2010中得到了正確的結果,只能說運氣比較好,微軟的工程師對此做了特殊處理。所以,不要返回局部變量的引用。

?

那么,如果我們返回new出來的對象引用會怎么樣呢?代碼如下:

inline const CComplex& operator +(const CComplex& lhs, const CComplex& rhs)

{

????CComplex *result = new CComplex(lhs.m_real + rhs.m_real, lhs.m_imagin + rhs.m_imagin);

????return *result;

}

?

//用戶使用代碼

CComplex a(1, 1);

CComplex b(1, 4);

?

const CComplex& c = a + b;

delete &c;

?

這樣的方式有兩個缺點:

(1)operator +函數只申請內存,易造成內存泄漏,特別是在鏈式操作時,增加了用戶使用的負擔。

(2)內存的申請與釋放不在同一模塊中,將一個函數功能硬生生地分到了兩個層次的函數中,這影響了模塊功能的完整性與單一性,破壞了函數的內聚性。

所以,也不要返回new出來的對象引用。

總結

以上是生活随笔為你收集整理的提高C++代码质量 - [083]不要返回局部变量的引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。