-
1 # 使用者5620642497623
-
2 # 使用者1047557101249
c語言規定,函式返回值的型別是由函式首部定義的型別決定。函式返回值應與首部定義的型別一致,如若不一致,則自動將返回值強制轉換為函式首部定義的型別。沒有定義型別時預設為int型。
也就是說你的函式是什麼型別,返回值就是什麼型別。
比如:
函式定義 int fun(int a,char b)
返回值就是整型
函式定義 int *fun(int a)
返回值就是基型別為整型的指標
函式定義 void fun(int a)
無返回值
擴充套件資料
函式可以有返回值,只要 return 就可以給出一個,不過常常不用它,有兩個原因:
1、C/C++裡返回值是複製出去的,而對於大的物件,複製的代價很高;
2、有些物件是不能複製的,至少編譯器不知道怎麼複製,比如陣列。
於是有了下面這樣的函式:
bool GetObj(ObjType& obj);
bool Enwxxxcode-style(const char* src, char* dest);
用一個引數來代替返回值,而返回值只是指示函式執行是否成功。
返回一個大物件是困難的,但這個困難存在於 C 程式中,而不是 C++ 程式中。 C 函數里較少透過返回一個指標來返回物件,因為:
1、如果指標指向棧變數,毫無疑問,要麼不用這個返回值,要麼是一個錯誤;
2、如果指標指向堆變數,需要用這個函式的程式設計師會好好的看文件且足夠細心會呼叫 free,要麼就是記憶體洩漏;
3、如果指標指向 static 變數,那麼用這個函式的程式設計師牢牢記住“下次呼叫這個函式以後,上次的返回值也會跟著變”。
在C++裡直接返回裸指標的話,情況並不會有什麼起色,不過 C++ 有智慧指標的,通常它們指向堆變數,佔用的空間和裸指標一樣大。考慮前面第一個函式,寫成:
std::auto_ptr
GetObj();
返回值如果不要,作為臨時變數,會立即被析構,返回的物件被釋放;如果需要,就得賦值給另一個智慧指標。總之不用程式設計師記得,編譯器會保證這個物件的釋放。
考慮第二個函式,稍微有一點麻煩,因為 auto_ptr 是不能用來持有陣列的,不過,在C++的世界裡,std::string 幾乎總是比 char* 好用:
std::auto_ptr<std::string> Enwxxxcode-style(const char
回覆列表
是由你定義函式時所定義的函式的型別決定的。 也就是說你的函式是什麼型別,返回值就是什麼型別。