C到C++ 快速過分 B 函數重載

函數回顧與形參實參

此次的內容主要是函數重載,這裏簡要複習函數的內容,並對形參和實參進行重申。


ios

可以完成特定功能的代碼塊,這即是函數。 對於幾乎任何編程語言,函數都是存在的。
看以下代碼:
編程


#include <stdio.h>
int fun(int k)                // step  1
{
    int i, sum = 0;
    for(i = 0; i <= k; i++)
        sum += i;
    return sum;
}
小程序

int main()
{
    int n, s;
    scanf("%d", &n);
    s = fun(n);                // step 2
    printf("%d\n", s);
    return 0;
}
編程語言


在主函數上面的一部分代碼即是函數,它接受一個「參數」,並「返回」從1到這個參數的和。

函數

在這個程序中,step 1是函數的定義,它規定了fun函數的做用和功能;step 2是函數的調用,它引發函數的執行。
spa

main函數被稱爲調用函數,而fun函數被稱做被調函數調用函數引發被調函數的執行。
ci

main中的變量n被稱爲實參,fun中的變量k被稱爲形參。
作用域

函數之間的關係,其實就是調用和被調用的關係。原型


主函數在調用fun函數的時候,將n的值傳遞了過去;fun接受這個值,用它初始化局部變量k
聲明在不一樣函數中的變量是相互不可見的。好比main函數沒法操做fun函數中的k, i, sum;fun函數也看不見main函數中的n和s。

所以,請時刻記住函數中的變量有封閉性一個函數中的指令,僅能利用在它這個函數內部中聲明的變量。形參固然也算做函數內部變量的一部分。它奇怪的位置決定了它負責接受主函數中傳遞過來的值。

在此給出上述代碼的C++代碼,其實區別不大。因爲咱們將函數的定義區寫在了主函數以後,加上函數聲明是必須的。咱們一般對特別長的函數這麼作。
string

#include <iostream>
using namespace std;

int fun(int k);    //函數聲明  又叫函數原型
int main()
{
    int n, s;
    cin >> n;
    cout << fun(n) << endl;    //函數調用
    return 0;
}

int fun(int k)                // 函數定義
{
    int i, sum = 0;
    for(i = 0; i <= k; i++)
        sum += i;
    return sum;
}

調用函數中的被調函數自己(例中爲 fun(n) )即是fun函數的返回值,所以能夠直接將它輸出出來,無需再賦值保存。


函數重載

在C中,兩個函數不能使用同一個函數名稱。
而在C++中,這麼作是容許的。可是得知足必定條件:這兩個函數不能接受相同形式的參數。

這就是函數重載。

給一個簡單的例子:

#include <iostream>
using namespace std;

void k()
{
    cout << "I'm a blank function.\n";
}

int k(int n)
{
    int i, sum = 0;
    for(i = 0; i <= n; i++)
       sum += i;
    return sum;    
}

int main()
{
    int n;
    k();            // 1
    cin >> n;
    cout << "The sum from 1 to " << n << " is "
          << k(n) << endl; // 2
    return 0;
}

你們能夠看到,有兩個函數重名了,並且IDE沒有報錯。

這個程序的運行結果代表,1這裏調用的是第一個k函數,2這裏,調用的是第二個k函數。

C++會將函數名稱和參數的順序類型都考慮進去,選擇一個合適的函去去調用。
這就是爲何在使用函數重載的時候,兩個同名函數的參數列表不能相同,由於這樣C++就沒法辨別你調用的是二者中的哪一個:

//這是一個錯誤的程序
#include <iostream>
using namespace std;
void k(int m)
{
    cout << m << " * 2 = " << m * 2 << endl;
}

int k(int n)
{
    int i, sum = 0;
    for(i = 0; i <= n; i++)
        sum += i;
    return sum;
    }

int main()
{
    int n;
    cin >> n;
    k(n);
        
    cout << "The sum from 1 to " << n << " is " << k(n) << endl;
    return 0;
}

這是不容許的,C++沒法辨別你的k指的是哪一個,緣由是顯而易見的。

本次內容就到此爲止,做用域的內容被安排在和名稱空間一塊兒講。今天有點不在狀態,因此寫得很差,你們見諒。

有人會問,函數重載的做用是什麼?爲何要容許重載?
由於經過函數重載,咱們能夠將功能相似的函數使用統一的名稱,儘管他們的變量是不一樣類型的。

這是C++達到」多態「特性的途徑之一。    


重載特性一樣在最後的示例程序中給出,這樣的一個小程序沒法看出重載的威力,卻有助於你理解重載的意圖。

示例程序:

#include <iostream>#include <cstring>using namespace std;void swap(int* p, int* q){    int temp = *q;    *q = *p;    *p = temp;}void swap(double *p, double *q){    double temp = *q;    *q = *p;    *p = temp;}void swap(char *p, int n, char *q, int m){    int len = (n > m) ? n : m;    for(int i = 0; i < len + 1; i++)    {        char temp = q[i];        q[i] = p[i];        p[i] = temp;    }}int main(){    int a, b;    double m, n;    char s1[50] = "I LOVE YOU!";    char s2[50] = "YOU ARE THE APPLE IN MY EYE!"    int len1 = strlen(s1), len2 = strlen(s2);    cin >> a >> b >> m >> n;    cout << "a = " << a << endl     << "b = " << b << endl         << "m = " << m << endl     << "n = " << n << endl;    cout << s1 << endl     << s2 << endl;    swap(a, b);    swap(m, n);    swap(s1, len1, s2, len2);    cout << "a = " << a << endl     << "b = " << b << endl         << "m = " << m << endl     << "n = " << n << endl;    cout << s1 << endl     << s2 << endl;    return 0;}

相關文章
相關標籤/搜索