1.為什么要用函數
一個較為復雜的系統往往需要划分為若干個子系統,然后對這些子系統分別進行開發和調試。c++語言中的子程序體系為函數。函數編寫后,可以被重復使用,
使用時可以只關心函數的功能和使用方法而不必關心函數功能的具體實現。這樣有利於代碼重用,可以提高開發效率,增強程序的可靠性,也便於分工合作和
修改維護。
2.為什么要使用函數重載
兩個以上的函數,具有相同的函數名。但是形參的個數和或者類型不同,編譯器根據實參和形參的類型及個數的最佳匹配,自動確定調研哪一個函數,這就是
函數的重載。
如果沒有重載機制,那么對不同類型的數據進行相同的操作也需要定義名稱完全不同的函數,列如定義加法函數,就必須這樣對整數的加法和浮點數的加法使
用不同的函數名:
int iadd(int x,int y); float fadd (float x,float y);
這樣調用就非常不方便
重載后:
int add(int x,int y); float add(float x,float,y); //形參類型不同 int add(int x,int y); int add(int x,int y,int z); //形參個數不同
3.值傳遞和地址傳遞
C++的按值傳遞和按地址傳遞有明顯不同,下面對他們作個區別:
按值傳遞:在調用函數中將原函數的值拷貝一份過去被調用的函數,在被調用函數中對該值的修改不會影響原函數的值。
按地址傳遞:在調用函數的時候將原函數的值所在的地址拷貝一份過去,被調用函數對這個地址所作的修改會影響原來的值。
1.按值傳遞
#include<iostream> using namespace std; void changeNumber(int x); int main(void){ int a = 10; cout << "a = " << a << endl; changeNumber(a); cout << "Now a = " << a << endl; return 0; } void changeNumber(int x){ x = x + 5; }
這里的運行結果是
2.按地址傳遞
#include<iostream> using namespace std; void changeNumber(int &x); int main(void){ int a = 10; cout << "a = " << a << endl; changeNumber(a); cout << "Now a = " << a << endl; return 0; } void changeNumber(int &x){ x = x + 5; }
main()函數調用changeNumber()的時候,將a的地址,也就是&a傳遞給changeNumber()函數,這實際上就是將a的地址拷貝一份過去給changeNumber()函數,在前面的例子中,main()拷貝並傳遞的是a,這里main()拷貝並傳遞的是&a,兩者都可以理解為按值傳遞,只不過第二個例子中的“值”是a的地址而已。
4.遞歸函數
構成遞歸需具備的條件:
1.子問題須與原始問題為同樣的事,且更為簡單。
2.不能無限制的調用本身,必須有個出口,化簡為非遞歸狀況處理。
實列:階乘
#include <iostream> using namespace std; int Leo(int n){ int sum = 1; if(1 == n)//遞歸終止條件 { return 1; } sum =n * Leo(n - 1); return sum;//返回階乘的總和 } int main(){ int num; cin >> num;//輸入一個數 cout << Leo(num) << endl; //輸出該數的階乘 return 0;
} //在求X的階乘和時可以利用遞歸的思想把大問題轉化成小問題再把小問題轉化成更小的問題最后得解