在乙個函式的內部,return的時候返回的都是乙個拷貝,不管是變數、物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。
1. 如果返回乙個基本型別的變數,比如:
int a;
a = 5;
return a;
那麼就返回a的乙個拷貝,即5返回,然後a就被銷毀了。儘管a被銷毀了,但它的副本5還是成功地返回了,所以這樣做沒有問題。
2. 但是對於非動態分配(new/malloc)得到的指標,像1那麼做就會有問題,比如在某個函式內部:
int a = ;
return a;
那麼也會返回指標a的乙個拷貝,我們假定a的位址值為0x002345fc,那麼這個0x2345fc是能夠成功返回的。當return執行完成後,a就要被銷毀,也就是0x002345fc所指向的記憶體被**了。如果這時候在函式外面,去位址0x002345fc取值,那得到的結果肯定是不對的。這就是為什麼不能返回區域性指標的原因。返回區域性變數的引用的道理和這個類似。
3. 對於返回(動態分配得到的)指標的另外一種情況,比如在函式內部:
int a = new int(5);
return a;
這樣做是可以的。return a執行完後,a並沒有被銷毀(必須要用delete才能銷毀a),所以這裡返回的a是有效的。
4. 如果不是基本資料型別,比如:
class a ;
如果在某個函式內部有乙個a類的區域性變數,比如:
a a;
return a;
這時候也會返回a的乙個拷貝,如果a沒有寫深拷貝建構函式,就會呼叫預設的拷貝建構函式(淺拷貝),這樣做就會失敗的;
如果
a中提供了深拷貝建構函式,則這樣做就是可以的。
實驗**如下:
#include using namespace std;
int some_fun1()
int* some_fun2()
int* some_fun3()
class csomething};
class ca
// 如果不實現深拷貝,請注釋這個拷貝建構函式
ca(ca& obj)
~ca()
void show()
void setvalue(int a, int b)
void getsthaddress()
}; ca some_fun4()
int main(int argc, char* argv)
關於函式返回值的幾種情況
在乙個函式的內部,return 的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,...
關於函式返回值的幾種情況
在乙個函式的內部,return的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,所...
關於函式返回值的幾種情況
在乙個函式的內部,return 的時候返回的都是乙個拷貝,不管是變數 物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。1.如果返回乙個基本型別的變數,比如 int a a 5 return a 那麼就會 a的乙個拷貝,即 5返回,然後 a就被銷毀了。儘管 a被銷毀了,但它的副本 5還是成功地返回了,...