C++入門教程(12):定義函數(shù)

小古銀的官方網(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;
    }
}

因為newnumint類型,所以返回值我就決定是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ā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容