關於函式返回引用的分析?

2021-07-02 03:57:14 字數 1772 閱讀 7306

一、函式返回值和返回引用是不同的

函式返回值時會產生乙個臨時變數作為函式返回值的副本,而返回引用時不會產生值的副本。

1.普通函式返回值

c++ primer中這樣寫:函式的返回值用於初始化在呼叫函式處建立的臨時物件。在求解表示式時,如果需要乙個地方儲存其運算結果,編譯器會建立乙個沒有命名的物件,這就是臨時物件。

例如:

#includeusing namespace std;

int add(int i,int j)

int main()

這個函式要麼返回其形參 word 的副本,要麼返回乙個未命名的臨時string 物件,這個臨時物件是由字串 word 和 ending 的相加而產生的。這兩種情況下,return 都在呼叫該函式的地方複製了返回的 string 物件。

2.普通函式返回引用

(1)當函式返回引用型別時,沒有複製返回值。相反,返回的是物件本身。

// find longer of two strings

const string &shorterstring(const string &s1, const string &s2)

形參和返回型別都是指向 const string 物件的引用,呼叫函式和返回結果時,都沒有複製這些 string 物件。

簡單的說,返回的引用是函式的引數s1或s2,同樣s1和s2也是引用,而不是在函式體內產生的。函式體內區域性物件是不能被引用的,因為函式呼叫完區域性物件會被釋放。

(2)千萬不要返回區域性物件的引用(返回引用時並不建立臨時物件)

當函式執行完畢時,將釋放分配給區域性物件的儲存空間。此時,對區域性物件的引用就會指向不確定的記憶體。

// disaster: function returns a reference to a local object

const string &manip(const string& s)

這個函式會在執行時出錯,因為它返回了區域性物件的引用。當函式執行完畢,字串 ret 占用的儲存空間被釋放,函式返回值指向了對於這個程式來說不再有效的記憶體空間。

3.類的成員函式返回引用

在類的成員函式中,返回引用的類物件,當然不能是函式內定義的類物件(會釋放掉),一般為this指向的物件,典型的例子是string類的賦值函式。

string & string::operator=(const string &other)  //注意與「+」比較,函式為什麼要用引用呢?a=b=c,可以做為左值

這與sting類中的「+」運算子過載不一樣。

「+」運算子的過載不能返回引用,因為它返回的是在函式內定義的類物件.

string string::operator +(const string &str)    

else if (!m_string)

else

return newstring;

}

4.引用返回左值

返回引用的函式返回乙個左值。因此,這樣的函式可用於任何要求使用左值的地方:

#include#includeusing namespace std;

char &change_char(string &str,int x)

int main()

int main()

int main()

{ string p;

p=fun();

cout<

關於C 中函式返回引用的討論

從函式返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用 c 中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一...

關於C 中函式返回引用的討論

從函式 返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用.1 首先,返回引用,要求在函式的引數中,包含有以 引用方式或 指標方式存在的,需要被返回的引數。比如 in...

關於C 中函式返回引用的討論

從函式返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用 c 中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一...