函數(shù)和string對象
-
例子:聲明string對象數(shù)組,然后傳遞給一個函數(shù)
#include <iostream> #include <string> using namespace std; const int SIZE = 5; void display(const string str1[],int n); // 形參str1是一個指向string對象的指針 int main() { string list1[SIZE]; // 一個數(shù)組,存儲5個字符串對象 cout << "輸入"<< SIZE << "個你喜歡的球隊名字:\n"; for (int i=0;i<SIZE;i++){ cout << i+1 << ":"; getline(cin,list1[i]); } cout << "名單如下:\n"; display(list1,SIZE); return 0; } void display(const string str1[],int n){ for (int i=0;i<n;i++){ cout << i+1 << ":"<< str1[i] << endl; } }
函數(shù)和array對象
-
例子:c++模板類arry
#include <iostream> #include <array> #include <string> using namespace std; const int SEASONS = 4; // 四季 const array<std::string,SEASONS> names = {"Spring","Summber","Fall","Winter"}; void fill(array<double,SEASONS> *pointer); void show(array<double,SEASONS> data); int main() { array<double,SEASONS> expenses; fill(&expenses); // 函數(shù)fill()用來修改expenses對象,需要將該對象的地址傳遞給函數(shù) show(expenses); // 函數(shù)show()用來顯示expenses的內(nèi)容,可以按值傳遞 return 0; } void fill(array<double,SEASONS> *pointer) { for (int i=0;i<SEASONS;i++){ cout << "輸入" << names[i] << "的開銷:"; cin >> (*pointer)[i]; } } void show(array<double,SEASONS> data){ double total = 0.0; cout << "\n開銷\n"; for (int i=0;i<SEASONS;i++){ cout << names[i] << ":"<<data[i] << endl; total += data[i]; } cout << "總共的花銷是:" << total << endl; }- 函數(shù)原型中的參數(shù)和定義時的參數(shù)名字寫成一樣的
遞歸
cpp函數(shù)可以調(diào)用自己,但是不允許main()函數(shù)調(diào)用自己
-
一個簡單的遞歸例子
void recurs(argumentList) { statement1; if (test){ recurs(arguments); } statement2; } -
多次遞歸調(diào)用的遞歸函數(shù)
#include <iostream> using namespace std; const int LENGTH = 66; const int DIVES = 6; void subdivide(char arr1[],int low,int high,int level); int main() { char ruler[LENGTH]; int i; for (i = 1;i< LENGTH -2;i++){ ruler[i] = ' '; } ruler[LENGTH-1] = '\0'; int max = LENGTH -2; int min = 0; ruler[min] = ruler[max] = '|'; cout << ruler << endl; for (i = 1;i<= DIVES;i++){ subdivide(ruler,min,max,i); cout << ruler << endl; for (int j = 1;i< LENGTH-2;j++){ ruler[j] = ' '; } } return 0; } void subdivide(char arr1[],int low,int high,int level){ if (level == 0){ return ; } int mid = (low + high) /2; arr1[mid] = '|'; subdivide(arr1,low,mid,level -1); subdivide(arr1,mid,high,level-1); }- 函數(shù)subdivide()使用level變量來控制遞歸層數(shù),每次遞歸的時候level減去1,當(dāng)level變成0的時候停止遞歸
- 函數(shù)subdivide()調(diào)用了自己兩次,左半邊一次,右半邊一次
- 最初的中間點被用作一次調(diào)用之后的右端點和另一側(cè)的左端點
- 調(diào)用的次數(shù)呈幾何級數(shù)增長,即2的次方
函數(shù)指針
-
假設(shè)要寫一個函數(shù),用來計算不同算法函數(shù)的運行時間,那么需要將不同算法函數(shù)的地址傳給這個函數(shù),即需要:
-
獲取函數(shù)的地址:只需要使用函數(shù)名
process(abc); // 假設(shè)abc()是一個函數(shù),那么abc就是這個函數(shù)的地址 -
聲明一個函數(shù)指針:必須指定指針指向的函數(shù)類型,即指定函數(shù)的返回類型和函數(shù)的參數(shù)列表(類似于函數(shù)的原型)
double func(int); // 函數(shù)func()的原型 double (*pr)(int); // (*pr)是一個函數(shù),pr是一個函數(shù)指針 // 將相應(yīng)函數(shù)的地址賦給pr pr = func; // 指針pr現(xiàn)在指向了函數(shù)func()- 上述代碼中,指針pr指向了一個函數(shù),這個函數(shù)有一個int類型的返回值并且返回了double類型
- 加括號是用來保證正確的運算符優(yōu)先級,比如:
- *pr(int):表示函數(shù)pr()是一個返回指針的函數(shù)
- (*pr)(int):表示pr是一個指向函數(shù)的指針
- 在將指針指向某個函數(shù)的時候,被指向的函數(shù)參數(shù)列表,返回類型必須和指針的參數(shù)列表,返回類型相同,不然編譯器就拒絕
-
使用函數(shù)指針來調(diào)用函數(shù)
double func(int); // 函數(shù)func()的原型 double (*pr)(int); // (*pr)是一個函數(shù),pr是一個函數(shù)指針 // 方式1 pr = func; // pr執(zhí)行函數(shù)func() double x = func(4); // 可以通過正常的方式來調(diào)用函數(shù)func() double y = (*pr)(5); // 通過指針的方式調(diào)用函數(shù)func() // 方式2:直接像使用函數(shù)名那樣使用指針pr double x = pr(5) // 通過指針的方式調(diào)用func()的另一種寫法
-
函數(shù)指針示例
-
例子:寫一個函數(shù),計算別的函數(shù)的運行時間
#include <iostream> double funny(int); double echo(int); void times(int lines,double(*pr)(int)); int main(){ using namespace std; int code; cout << "輸入行數(shù):"; cin >> code; cout << "函數(shù)funny的運行時間是:"; times(code,funny); cout << "函數(shù)echo的運行時間是:"; times(code,echo); return 0; } double funny(int i){ return 0.05*i; } double echo(int i){ return 0.03*i + 0.005*i*i; } void times(int lines,double(*pr)(int)){ using namespace std; cout << (*pr)(lines) << endl; }