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