小古銀的官方網(wǎng)站(完整教程):http://www.xiaoguyin.com/
C++入門教程視頻:https://www.bilibili.com/video/av20868986/
既然用過std::abs()函數(shù),那么,現(xiàn)在就以它為例,實現(xiàn)一個myabs()函數(shù)來實現(xiàn)求絕對值。
返回值類型 函數(shù)名稱(參數(shù)類型 參數(shù)名稱, 參數(shù)類型 參數(shù)名稱)
{
函數(shù)的內(nèi)容
}
基礎(chǔ)示例
根據(jù)這個格式實現(xiàn)myabs()函數(shù):
#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;
}
輸出結(jié)果:
1024
2333
6666
基礎(chǔ)講解
先看一下調(diào)用myabs()的時候跟調(diào)用std::abs()函數(shù)時是一樣的。
然后再看看定義:
int myabs(int num)
{
int value = 0;
if (num < 0)
{
value = -num;
}
else
{
value = num;
}
return value;
}
myabs是函數(shù)的名稱,myabs前面是返回值的類型,后面括號內(nèi)是函數(shù)的參數(shù),num是需要轉(zhuǎn)成絕對值的值,它只接受int類型,所以調(diào)用就可以這樣:
int absnum = myabs(-100);
上面代碼中,函數(shù)參數(shù)num叫做形式參數(shù);而傳進去的參數(shù)-100叫做實際參數(shù)。
形式參數(shù)實際上是一個局部變量,它的作用域就是在myabs()函數(shù)內(nèi)。假設(shè)傳入一個數(shù)值,上面代碼函數(shù)的形式參數(shù)的行為是:int num = 100;,然后執(zhí)行函數(shù)內(nèi)的代碼;假設(shè)傳入一個變量value,那么形式參數(shù)的行為就是:int num = value;。也就是說,當(dāng)有參數(shù)傳入函數(shù)時,傳入?yún)?shù)的行為就是一個賦值行為。所以,如果一個參數(shù)占用內(nèi)存比較大,那就會導(dǎo)致大量數(shù)據(jù)被復(fù)制。
以下代碼判斷,如果num小于0就給它一個負(fù)號讓它變成正數(shù),然后再賦值給value;如果num非負(fù)則直接賦值給value:
int value = 0;
if (num < 0)
{
value = -num;
}
else
{
value = num;
}
然后,myabs()函數(shù)返回計算結(jié)果,也就是變量value:
return value;
當(dāng)然啦,為了方便分析我做了一些拆分,實際上,myabs()函數(shù)可以簡寫成這樣:
int myabs(int num)
{
if (num < 0)
{
return -num;
}
else
{
return num;
}
}
因為newnum是int類型,所以返回值我就決定是int類型了。如果你覺得返回值肯定是非負(fù)的,那么你也是對的。所以,myabs()函數(shù)也可以寫成這樣:
unsigned int myabs(int num)
{
if (num < 0)
{
return -num;
}
else
{
return num;
}
}
再放一個含有多個參數(shù)的函數(shù)的栗子:
#include <iostream>
int add(int a, int b)
{
return a + b;
}
int main(void)
{
std::cout << add(-5, 100) << std::endl;
return 0;
}
當(dāng)然啦,單純地相加就沒必要寫成函數(shù)了。
補充知識
在C++11前,為了減少函數(shù)返回值的額外開銷,一般將非基本數(shù)據(jù)類型的類型(例如std::string)通過參數(shù)來返回。C++11開始,返回值直接返回不會帶來額外的開銷。因為返回變量時,編譯器并不會銷毀局部變量的內(nèi)存而且還會將內(nèi)存地址直接傳遞給保存返回值的變量。由于這個轉(zhuǎn)變,使C++設(shè)計出來的函數(shù)更加直觀地表達(dá)出其意義。而這個機制就叫做完美轉(zhuǎn)發(fā)。