上一篇隨筆寫了關於C++在注釋,輸入輸出,局部變數說明的擴充,以及const修飾符與C中的#define的比較,也得到了幾位學習C++朋友們的協助講解,十分感謝,我也希望歡迎有更多學習C++的朋友一起來討論,這樣大家都能共同進步。那麼,今天這篇要講的是C++在函數原型上和C的區別、內嵌函式、帶有預設參數的函數以及函數的重載。
1.大家都熟悉在C中,如果函數調用的位置在函數定義之前,那麼在函數調用之前要對函數原型聲明或調用之前就把函數直接定義好了。比如:
#include<stdio.h>
int add(int x,int y);
int main()
{
int x,y,sum;
printf("請輸入兩個整數:\n");
scanf("%d,%d",&x,&y);
sum=add(x,y);
printf("x+y=%d",sum);
return 0;
}
int add(int x,int y)
{
return x+y;
}
不過也可以採用簡潔的方式來聲明,如:int add(); add(); 都可以通過編譯;但是在C++裡,如果函數定義在後,調用在前,那函數原型的聲明必須是int add(int x,int y);函數名稱,參數類型和個數,以及傳回值都必須說明;如果函數定義在前,調用在後則和C一樣。以上這種形式在C++裡也等同於int add(int ,int);如果在原型說明中沒有指出傳回型別C++預設傳回型別為int,不需要傳回值,就用void。另外標準C++要求的main函數的傳回值必須為int;
2.內嵌函式就是在函數說明前冠以關鍵字"inline",當C++在編譯時間使用函數體中的代碼插入到要調用該函數的語句之處,同時用實參代替形參,以便在程式運行時不再進行函數調用。比如:
#include <iostream>
using namespace std;
inline int add(int a,int b)
{
return a+b;
}
int main()
{
int x,y,sum;
cin>>x>>y;
sum=add(x,y);
cout<<"x+y="<<sum<<endl;
return 0;
}
在編譯時間,遇到函數啊add(x,y)時,用函數體代替add(x,y),同時實參代替形參,這樣“sum=add(x,y)”被替換成“{
int a=x;int b=y;sum=a+b;}”;那麼為什麼要引入內嵌函式呢?主要是為消除函數調用時的系統開銷,以提高系統的運行速度。在程式執行過程中調用函數,系統要將程式當前的一些狀態資訊存到棧中,同時轉到函數的代碼處去執行函數體的語句,這些參數儲存和傳遞過程中需要時間和空間的開銷,使得程式效率降低。但是並不是什麼函數都可以定義為內嵌函式,一般情況下,只有規模很小而是用頻繁的函數才定義為內嵌函式,這樣可以大大提高運行速率。
3.一般情況下,實參的個數應該和形參的一樣,但在C++中則不一定,方法是在說明函數原型時,為一個或多個形參制定預設值,以後調用此函數,如省略其中一實參,C++自動地以預設值作為相應參數的值。比如int add(int x=10,int y=10),那麼我們在調用該函數時可以有三種寫法:add(50,50)//結果為50+50;add(50)//結果為50+10;add()//結果10+10;這樣使函數更加靈活。但要注意的是預設參數必須是在參數列表的最右端,int add(int x,int y=10,int z)這樣是錯誤的,還有不允許某個參數省略後,再給其後的參數指定參數值。如果函數定義在函數調用之後,則函數調用之前需要函式宣告,此時必須在函式宣告中給出預設值,在函數定義時就不要給出預設值了(因為有的C++編譯系統會給出"重複指定預設值"的錯誤資訊);
4.函數的重載,對於這個我想學過C#的朋友一定在熟悉不過了,它意味著,只要函數參數的類型不同,或者參數的個數不同,或者兩者兼而有之,兩個或兩個以上的的函數可以使用相同的函數名。儘管簡單,但是我還是想說說它在C++裡所要注意的幾個問題:1.函數傳回值不再函數參數匹配檢查之列;2.函數重載與帶預設參數的函數一起使用可能引起二義性比如:int fun(int x=0;int y=10){return x+y;}和int fun(int r){return r;}這時候我這樣調用fun(10);3.如果函數調用給出的實參和形參類型不符,C++會自定執行類型轉換,轉換成功會繼續執行,但是在這種情況下可能會出現不可識別的錯誤:int add(int x,int y)和long add(long,long),這時候我這樣調用add(9.9,8.8);
5.最後還是一樣通過一個執行個體來總結一下今天的內容:
1 #include "stdafx.h"
2 #include <iostream>
3 usingnamespace std;
4
5 int add(int x,int y);//或int add(int,int)
6
7 inline int sub(int x,int y)//內嵌函式
8 {
9 return x-y;
10 }
11
12 double mul(double x=10.0,double y=10.0);//帶有預設參數的函數
13
14 float add(float x,float y)//函數重載
15 {
16 return x+y;
17 }
18
19 int main()
20 {
21 int x,y,result;
22 cout<<"請輸入兩個整數:";
23 cin>>x>>y;
24 result=add(x,y);
25 cout<<"普通函數(加法):x+y="<<result<<endl;
26
27 cout<<"請輸入兩個整數:";
28 cin>>x>>y;
29 result=sub(x,y);
30 cout<<"內嵌函式(減法):x-y="<<result<<endl;
31
32 double a,b,mul_result;
33 cout<<"請輸入兩個雙精確度數:";
34 cin>>a>>b;
35 mul_result=mul(a,b);
36 cout<<"帶有預設參數的函數(乘法):a*b="<<mul_result<<endl;
37
38 float c,d,sum;
39 cout<<"請輸入兩個單精確度數:";
40 cin>>c>>d;
41 sum=add(c,d);
42 cout<<"重載加法函數:c+d="<<sum<<endl;
43
44 return0;
45 }
46
47 int add(int x,int y)
48 {
49 return x+y;
50 }
51
52 double mul(double x,double y)
53 {
54 return x*y;
55 }
結果: