函數回顧與形參實參
此次的內容主要是函數重載,這裏簡要複習函數的內容,並對形參和實參進行重申。
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;}