說明:在學習和編寫C++代碼時,經常會遇到這樣的問題:一個帶返回值的函數,到底應該返回值呢,還是應該返回引用呢;在傳遞參數的時候,是應該傳遞參數的引用呢,還是應該傳值呢?請看下面代碼:
1 void myswap(int &a, int &b) 2 { 3 int temp = a; 4 a = b; 5 b = temp; 6 }
相信上面代碼大家經看到,這就是一個常見的交換兩個整數值的代碼,但如果傳遞參數里面傳的是值而不是引用呢,答案是這樣的交換根本沒用。
探討:
1.其實當按引用傳遞對象的時候,調用函數以及被調用的函數都是對同一個對象進行操作,即傳遞的是對象本身;而當傳遞對象(值)的時候,會調用拷貝構造函數產生一個臨時變量,而該臨時的值即為傳遞參數的值。而此時,調用函數中操作的是原對象,即傳遞的對象,而被調用函數操作的只是原對象的一個副本,即通過拷貝構造函數生成的模子,因此,才有了上述交換失敗的情況。
2.同樣的道理, 返回對象時會生成返回對象的副本,返回對象的時間包括了調用復制構造函數來生成副本所需的時間和調用析構函數刪除副本所需的時間。而返回引用則可以節省時間和內存。
1 Person& Person::operator++() 2 { 3 age = 10; 4 return *this; 5 } 6 Person Person::operator++() 7 { 8 Person tmp(10); //創建對象 9 tmp.age = 20; 10 return tmp; //返回對象的副本,此處不能返回引用 11 } 12
3.然而並不是所有地方都可以返回引用的,當被調用函數中新建了一個變量時,該變量是不能返回引用的。因為臨時變量是有生命周期的,即在被調用函數內該臨時變量才會存在,當函數結束並准備返回參數時,該臨時變量已經不存在,這種情況下返回它的引用是不允許的。而這時候返回對象卻是可以的,因為你返回的僅僅是其通過拷貝構造函數產生的一個副本。