在乙個函式的內部,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)
2011-05-14
關於函式返回值的幾種情況
在乙個函式的內部,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還是成功地返回了,...