提高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]不要返回局部变量的引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言条件编译及编译预处理阶段
- 下一篇: C++写的一个简单的词法分析器(分析C语