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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

14. 函数返回值为引用?

發布時間:2025/3/21 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 函数返回值为引用?的全部內容,希望文章能夠幫你解決所遇到的問題。

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