日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/6/15 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 提高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]不要返回局部变量的引用的全部內容,希望文章能夠幫你解決所遇到的問題。

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