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

2021-05-27 14:47:18 字數 1335 閱讀 7949

在乙個函式的內部,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還是成功地返回了,...