關於函式返回值的幾種情況

2021-06-03 15:37:15 字數 1575 閱讀 9089

在乙個函式的內部,

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;

intsome_fun1()

int* some_fun2()

int* some_fun3()

class

csomething

}; classca

//如果不實現深拷貝,請注釋這個拷貝建構函式

ca(ca& obj)

~ca()

void show()

void setvalue(int a,int b)

void getsthaddress()

}; ca some_fun4()

intmain(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還是成功地返回了,...