函数和string对象
-
例子:声明string对象数组,然后传递给一个函数
#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]; // 一个数组,存储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; } }
函数和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); // 函数fill()用来修改expenses对象,需要将该对象的地址传递给函数 show(expenses); // 函数show()用来显示expenses的内容,可以按值传递 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; }
- 函数原型中的参数和定义时的参数名字写成一样的
递归
cpp函数可以调用自己,但是不允许main()函数调用自己
-
一个简单的递归例子
void recurs(argumentList) { statement1; if (test){ recurs(arguments); } statement2; }
-
多次递归调用的递归函数
#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); }
- 函数subdivide()使用level变量来控制递归层数,每次递归的时候level减去1,当level变成0的时候停止递归
- 函数subdivide()调用了自己两次,左半边一次,右半边一次
- 最初的中间点被用作一次调用之后的右端点和另一侧的左端点
- 调用的次数呈几何级数增长,即2的次方
函数指针
-
假设要写一个函数,用来计算不同算法函数的运行时间,那么需要将不同算法函数的地址传给这个函数,即需要:
-
获取函数的地址:只需要使用函数名
process(abc); // 假设abc()是一个函数,那么abc就是这个函数的地址
-
声明一个函数指针:必须指定指针指向的函数类型,即指定函数的返回类型和函数的参数列表(类似于函数的原型)
double func(int); // 函数func()的原型 double (*pr)(int); // (*pr)是一个函数,pr是一个函数指针 // 将相应函数的地址赋给pr pr = func; // 指针pr现在指向了函数func()
- 上述代码中,指针pr指向了一个函数,这个函数有一个int类型的返回值并且返回了double类型
- 加括号是用来保证正确的运算符优先级,比如:
- *pr(int):表示函数pr()是一个返回指针的函数
- (*pr)(int):表示pr是一个指向函数的指针
- 在将指针指向某个函数的时候,被指向的函数参数列表,返回类型必须和指针的参数列表,返回类型相同,不然编译器就拒绝
-
使用函数指针来调用函数
double func(int); // 函数func()的原型 double (*pr)(int); // (*pr)是一个函数,pr是一个函数指针 // 方式1 pr = func; // pr执行函数func() double x = func(4); // 可以通过正常的方式来调用函数func() double y = (*pr)(5); // 通过指针的方式调用函数func() // 方式2:直接像使用函数名那样使用指针pr double x = pr(5) // 通过指针的方式调用func()的另一种写法
-
函数指针示例
-
例子:写一个函数,计算别的函数的运行时间
#include <iostream> double funny(int); double echo(int); void times(int lines,double(*pr)(int)); int main(){ using namespace std; int code; cout << "输入行数:"; cin >> code; cout << "函数funny的运行时间是:"; times(code,funny); cout << "函数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; }