返回型別和 return 語句

2022-02-19 15:56:15 字數 4196 閱讀 1936

return 語句終止當前正在執行的函式並將控制權返回到呼叫該函式的地方。return 語句有兩種形式:

return;

return expression;

不要返回區域性物件的引用或指標:

函式完成後,它所占用的儲存空間也隨之被釋放掉。因此函式終止意味著區域性變數的引用和指標將指向不再有效的記憶體區域:

一種典型的錯誤就是將乙個指向區域性變數的指標作為函式的返回值。由於該陣列是區域性變數,因此在函式返回時其陣列空間已經作廢了,即指標應用一塊無意義的位址空間,所以不會有返回值。如果得到正常的值,只能是幸運的退出函式的時候,系統只是修改了棧頂的指標,並沒有清記憶體; 所以,是有可能正常訪問到區域性變數的記憶體的。 但因為棧是系統自動管理的,所以該記憶體可能會被分配給其他函式,這樣,該記憶體的內容就會被覆蓋;不再是原來的值了。

如前所述,返回區域性物件的引用是錯誤的,同樣返回區域性物件的指標也是錯誤的。一旦函式完成,區域性物件被釋放,指標將指向乙個不存在的物件。

引用返回左值:

函式的返回型別決定函式呼叫是否是左值。呼叫乙個返回引用的函式得到左值,其他返回型別得到右值。所以能為返回型別是非常量引用的函式的結果賦值:

1 #include 2

using

namespace

std;34

char &gel(string &str, size_t indx)78

int main(void

)

當然,如果函式返回的是常量引用,自然是不能給呼叫結果賦值的。

列表初始化返回值:

c++11 規定,函式可以返回花括號包圍的值的列表。類似於返回其他結果,此處的列表也用來對表示函式返回的臨時變數進行初始化。如果列表為空,臨時量執行值初始化,否則,返回的值由函式的返回型別決定:

1 #include 2 #include 3

using

namespace

std;

45 vector gel(void);7

}89int main(void)14

return0;

15 }

如果函式返回的是內建型別,則花括號包圍的列表中最多包含乙個值,而且該值所佔空間不應該大於目標型別的空間。如果函式返回的是類型別,由類本身定義初始值如何使用。

返回陣列指標:

因為陣列不能拷貝,所以函式不能返回陣列。不過,函式可以返回陣列的指標或引用:

1 #include 2

using

namespace

std;

34 typedef int arrt[10];//

arrt是乙個型別別名,表示的型別是含有10個整數的陣列5//

using arrt = int[10];

//arrt的等價宣告

6 typedef int arry[10][10];7

8 arrt* gel(arrt& x)

1112 arrt& lou(arry&x)

1516

int main(void

);18 arrt *b = gel(a);//

相當於b指向a

19for(auto indx : *b)

22 cout <

23//

輸出 1 2 3 0 0 0 0 0 0 0

24 arry c = };

25 arrt &d = lou(c);//

返回c的第乙個陣列元素的引用

26for

(auto indx : d)

29 cout <

30//

輸出 1 2 3 0 0 0 0 0 0 0

31return0;

32 }

當然,不使用型別別名也是可以的,但是要麻煩一些。其宣告如下:

type (*function(parameter_list))[dimension]

其中 type 表示元素型別,dimension 表示陣列的大小,類似於一般的陣列指標宣告。(*function(parameter_list)) 兩端的括號必須存在,如果沒有則函式的返回型別將是指標的陣列。

1 #include 2

using

namespace

std;34

int (*gel(int (&a)[10]))[10]78

int (&lou(int (&a)[10][10]))[10]

1112

int main(void

);14

int (*b)[10] =gel(a);

15for(auto indx : *b)

18 cout <

19//

輸出 1 2 3 0 0 0 0 0 0 0

2021

int c[10][10] = };

22int (&d)[10] =lou(c);

23for

(auto indx : d)

26 cout <

27//

輸出 1 2 3 0 0 0 0 0 0 0

28return0;

29 }

尾置返回型別:

在 c++11 中還有一種可以簡化上述 gel 函式宣告的方法,就是使用尾置返回型別。任何函式的定義都能使用尾置返回,但是這種形式對於返回型別比較複雜的函式最有效,比如返回型別是陣列的指標或者陣列的引用。尾置返回型別跟在形參列表後面並以乙個 -> 符號開頭。為了表示函式真正的返回型別,我們在本應該出現返回型別的地方放置乙個 auto:

1 #include 2

using

namespace

std;

34 auto gel(int (&x)[10]) -> int(*)[10]

78 auto lou(int (&x)[10][10]) -> int(&)[10]

1112

int main(void

);14

int (*b)[10] =gel(a);

15for(auto indx : *b)

18 cout <

19//

輸出 1 2 3 0 0 0 0 0 0 0

2021

int c[10][10] = };

22int (&d)[10] =lou(c);

23for

(auto indx : d)

26 cout <

27//

輸出 1 2 3 0 0 0 0 0 0 0

28return0;

29 }

使用 decltype:

還有一種情況,如果我們知道函式返回的指標將指向哪個陣列,就可以使用 decltype 關鍵字宣告返回型別:

1 #include 2

using

namespace

std;34

int a[3];5

6 decltype(a) *gel(int (&x)[3])9

10 decltype(a) &lou(int (&x)[10][3

])13

14//

注意:decltype(a)返回的只是乙個陣列,並不會將陣列型別轉化成指標或者引用型別,所以還要再加乙個指標或引用宣告符

1516

int main(void

);18

int (*c)[3] =gel(b);

19for(auto indx : *c)

22 cout <

23//

輸出1 2 3

2425

int d[10][3] = };

26int (&e)[3] =lou(d);

27for

(auto indx : e)

30 cout <

31//

輸出1 2 3

32return0;

33 }

函式(三) 返回型別和 return 語句

基於 c primer p199 1.無返回值的函式 只有返回型別是 void 的函式。可以不使用 return 語句,會隱式地執行。若想在中間位置提前退出,可以使用 return 語句。可以使用 return 語句返回另乙個返回 void 型別的函式。2.有返回值的函式 在含有 return 語句...

T SQL中return 返回語句學習

return命令用於結束當前程式的執行,返回到上乙個呼叫它的程式或其他程式,其語法格式如下 return 整數值或變數 return語句要指定返回值,如果沒有指定返回值,sql server系統會根據程式執行的結果返回乙個內定值,返回值含義如下所示 返回值 含義 0 程式執行成功 1 找不到物件 2...

T SQL中return 返回語句學習

return命令用於結束當前程式的執行,返回到上乙個呼叫它的程式或其他程式,其語法格式如下 return 整數值或變數 return語句要指定返回值,如果沒有指定返回值,sql server系統會根據程式執行的結果返回乙個內定值,返回值含義如下所示 返回值 含義 0 程式執行成功 1 找不到物件 2...