小古銀的官方網站(完整教程):http://www.xiaoguyin.com/
C++入門教程視頻:https://www.bilibili.com/vide...ios
既然用過std::abs()
函數,那麼,如今就以它爲例,實現一個myabs()
函數來實現求絕對值。ide
返回值類型 函數名稱(參數類型 參數名稱, 參數類型 參數名稱) { 函數的內容 }
根據這個格式實現myabs()
函數:函數
#include <iostream> int myabs(int num) { int value = 0; if (num < 0) { value = -num; } else { value = num; } return value; } int main(void) { std::cout << myabs(-1024) << std::endl; std::cout << myabs(2333) << std::endl; std::cout << myabs(6666) << std::endl; return 0; }
輸出結果:網站
1024 2333 6666
先看一下調用myabs()
的時候跟調用std::abs()
函數時是同樣的。設計
而後再看看定義:code
int myabs(int num) { int value = 0; if (num < 0) { value = -num; } else { value = num; } return value; }
myabs
是函數的名稱,myabs
前面是返回值的類型,後面括號內是函數的參數,num
是須要轉成絕對值的值,它只接受int
類型,因此調用就能夠這樣:視頻
int absnum = myabs(-100);
上面代碼中,函數參數num
叫作形式參數;而傳進去的參數-100
叫作實際參數。教程
形式參數其實是一個局部變量,它的做用域就是在myabs()
函數內。假設傳入一個數值,上面代碼函數的形式參數的行爲是:int num = 100;
,而後執行函數內的代碼;假設傳入一個變量value
,那麼形式參數的行爲就是:int num = value;
。也就是說,當有參數傳入函數時,傳入參數的行爲就是一個賦值行爲。因此,若是一個參數佔用內存比較大,那就會致使大量數據被複制。內存
如下代碼判斷,若是num
小於0就給它一個負號讓它變成正數,而後再賦值給value
;若是num
非負則直接賦值給value
:作用域
int value = 0; if (num < 0) { value = -num; } else { value = num; }
而後,myabs()
函數返回計算結果,也就是變量value
:
return value;
固然啦,爲了方便分析我作了一些拆分,實際上,myabs()
函數能夠簡寫成這樣:
int myabs(int num) { if (num < 0) { return -num; } else { return num; } }
由於newnum
是int
類型,因此返回值我就決定是int
類型了。若是你以爲返回值確定是非負的,那麼你也是對的。因此,myabs()
函數也能夠寫成這樣:
unsigned int myabs(int num) { if (num < 0) { return -num; } else { return num; } }
再放一個含有多個參數的函數的栗子:
#include <iostream> int add(int a, int b) { return a + b; } int main(void) { std::cout << add(-5, 100) << std::endl; return 0; }
固然啦,單純地相加就不必寫成函數了。
在C++11前,爲了減小函數返回值的額外開銷,通常將非基本數據類型的類型(例如std::string
)經過參數來返回。C++11開始,返回值直接返回不會帶來額外的開銷。由於返回變量時,編譯器並不會銷燬局部變量的內存並且還會將內存地址直接傳遞給保存返回值的變量。因爲這個轉變,使C++設計出來的函數更加直觀地表達出其意義。而這個機制就叫作完美轉發。