14. 函数返回值为引用?
函數(shù)返回值可以是引用嗎?
當(dāng)然可以,只是在函數(shù)返回引用的時(shí)候需要注意幾點(diǎn)。以下給出討論!
函數(shù)在返回值的時(shí)候,會(huì)產(chǎn)生一個(gè)臨時(shí)變量作為函數(shù)返回值的副本;而函數(shù)在返回引用的時(shí)候,不會(huì)產(chǎn)生副本!那么既然是引用,那么到底是引用誰呢?
首先,我們知道要清楚函數(shù)返回引用的幾種常見形式:
1)引用函數(shù)的參數(shù),當(dāng)然該參數(shù)(s1、s2)也是一個(gè)引用。
const string &shorter_String(const string &s1,const string &s2){return s1.size()<s2.size()?s1:s2;}?以上函數(shù)的返回值是引用類型。無論返回s1或是s2,調(diào)用函數(shù)和返回結(jié)果時(shí),都沒有復(fù)制這些string對(duì)象。簡單的說,返回的引用是函數(shù)的參數(shù)s1或s2,同樣s1和s2也是引用,而不是在函數(shù)體內(nèi)產(chǎn)生的。
2)不要返回局部對(duì)象的引用,函數(shù)體內(nèi)局部對(duì)象是不能被引用的,因?yàn)楹瘮?shù)調(diào)用完局部對(duì)象會(huì)被釋放。
const string &mainip(const string &s){string ret=s;return ret;}當(dāng)函數(shù)執(zhí)行完畢,程序?qū)⑨尫欧峙浣o局部對(duì)象的存儲(chǔ)空間。此時(shí),對(duì)局部對(duì)象的引用就會(huì)指向不確定的內(nèi)存。
3)在類的成員函數(shù)中,返回類對(duì)象的引用(不能是函數(shù)內(nèi)定義的類對(duì)象(會(huì)釋放掉)),一般為this指向的對(duì)象,典型的例子是string類的賦值函數(shù)。
String& String::operator =(const String &str) //注意與“+”比較,函數(shù)為什么要用引用呢?a=b=c,可以做為左值 { if (this == &str) { return *this; } delete [] m_string; int len = strlen(str.m_string); m_string = new char[len+1]; strcpy(m_string,str.m_string); return *this; }引用作為返回值,必須遵守以下規(guī)則:
(1)不能返回局部變量的引用。主要原因是局部變量會(huì)在函數(shù)返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會(huì)進(jìn)入未知狀態(tài)。
(2)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。雖然不存在局部變量的被動(dòng)銷毀問題,可對(duì)于這種情況(返回函數(shù)內(nèi)部new分配內(nèi)存的引用),又面臨其它尷尬局面。例如,被函數(shù)返回的引用只是作為一 個(gè)臨時(shí)變量出現(xiàn),而沒有被賦予一個(gè)實(shí)際的變量,那么這個(gè)引用所指向的空間(由new分配)就無法釋放,造成memory leak(內(nèi)存泄露)。
(3)可以返回類成員的引用,但最好是const。主要原因是當(dāng)對(duì)象的屬性是與某種業(yè)務(wù)規(guī)則(business rule)相關(guān)聯(lián)的時(shí)候,其賦值常常與某些其它屬性或者對(duì)象的狀態(tài)有關(guān),因此有必要將賦值操作封裝在一個(gè)業(yè)務(wù)規(guī)則當(dāng)中。如果其它對(duì)象可以獲得該屬性的非常 量引用(或指針),那么對(duì)該屬性的單純賦值就會(huì)破壞業(yè)務(wù)規(guī)則的完整性。
?
總結(jié)
以上是生活随笔為你收集整理的14. 函数返回值为引用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13. sizeof 和 strlen
- 下一篇: 15.赋值运算符为什么返回类的引用?不是