學習了C++的資料類型和控制語句,現在學習函數。
通常情況下,我們将相對獨立的,經常使用的功能抽象為函數。函數編寫好以後,可以被重複使用。
從上面我們可以看出,使用函數有利于代碼重用,提高效率。
函數的定義 | 類型辨別符 函數名(形式參數表) { 語句 } | 類型辨別符規定了函數的類型,也就是函數傳回值的類型,有return語句給出,無傳回值的函數類型辨別符為void,不必寫return語句 |
函數的聲明 | 調用之前,首先要在主調函數中聲明函數原型,形式如下: 類型說明符 被調函數名(含類型的形參表) | |
函數的調用 | 聲明後,可以按照以下格式調用: 函數名 (實際參數表) | 函數的調用,可以作為一條語句,這時,函數可以沒有傳回值 函數的調用出現在表達式中,這時就必須有一個明确的傳回值 |
注意 | 如果是在所有函數之前聲明了函數,則在程式任何地方都可以調用。 如果是在主調函數内部聲明,則隻在這個函數内部有效。 |
例:編寫一個求x的n次方的函數。
算法,x的n次方,就是n個x相乘,用疊代法應該就OK樂。
程式如下:
#include
double power(double x,int n);
void main(void)
{double x,int n;
cout<<"請輸入x,n的值"<
cin>>x>>n;
cout<
}
double power(double x,int n)
{double val=1.0;
int i;
for(i=1;i<=n;i++)
val=x*val;
return(val);
}
此處的函數power(doubel x,int n)就是定義的一個函數。可以被調用。函數要有一個傳回值,因為函數被調用時作為一個表達式出現的。必須有傳回值。
感覺寫程式就是做數學題。
函數調用 | 說明 | |
函數的嵌套調用 | 函數允許嵌套調用,就是函數1調用函數2,函數2調用函數3 | |
函數的遞歸調用 | 函數可以調用自身,稱為遞歸調用 | 對應遞歸的算法 遞歸的算法是一種遞推的算法,頗有些福爾摩斯的味道, |
函數的參數傳遞 | ||
内聯函數 | 為了節省開銷,在編譯時,将函數體嵌入每一個調用語句處, 一般不能有循環,和switch語句 其實,應該就是簡單的替換而已,就是為了省去調用和現場保護的時間和開銷 | 文法: inline 類型說明符 被調函數名(含類型說明的形參表) |
函數重載 | 重載這種機制,也是為了減少代碼量,編譯器會根據實參的類型和個數來查找比對的函數。 C++支援取相同的函數名,但是形參不同, |
函數的嵌套調用
例:輸入兩個整數,求他們的平方和。
算法:為了說明問題,設計兩個函數,fun1,用來求平方和,fun2,用來求平方。
程式如下:
#include
void main(void)
{int a,b;
int fun1(int x,int y);
cin>>a>>b;
cout<<"a,b的平方和:"<
}
int fun1(int x,int y)
{int fun2(int m);
return(fun2(x)+fun2(y));
}
int fun2(int m)
{return(m*m);
}
在fun1函數中,調用fun2函數。就是函數的嵌套調用。
函數的遞歸調用
例:求n!。
算法:n!就是n*(n-1)*(n-2)…*1.要求5!,就要先求4!,要求4!的階乘,就要先求3!要求3!就要先求2!要求2!就要先求1!1!=1。然後往回推回去。用循環語句實作的一個算法。
程式如下:
#include
long fac(int n)
{long f;
if(n<0) cout<<"你輸入的資料錯誤"<
if(n==0) f=1
if(n>0) f=fac(n-a)*n;
return(f);
}
就是這麼一個過程,加入n=4,就一直執行到n=0,是個已知的值,然後往回代,就能求出4!的值。
函數的參數傳遞
有兩種,一種是傳值,一種是傳引用。我們上面的都是傳值。
傳值 | 用實參來初始化形參 初始化完成後,無論形參怎樣變化,也不影響實參 | |
傳引用 | 對形參的修改,對實參也有效 | 先不管了,用到再看啦 |
C++的系統函數
應該是提高效率的最佳辦法,調用系統函數。這就要熟悉常用的系統函數。
看下火影,該吃飯了。