第十七章 特殊成员_函数指针
//5 函数指针 //我们知道数组名是指向数组第一个元素的常量指针 //同理,函数名也是指向函数第一条指令的常量指针,一般来说,在不出现异常的情况下 //程序在编译后,每个函数都有一个首地址,也就是函数第一条指令的地址 //那么这个指针就是函数指针,该指针可以看做是函数名,因为我们可以通过该指针调用函数 #include <iostream> #include <string> using namespace std; bool check(string); void get(float &, float &); //int (*func)(int); //该语句声明了一个int型指针func //它指向一个函数 //这个函数带有一个int型参数并返回int值 //我们要注意一点: //一个指向函数的指针必须确保该函数被定义且分配了内存 //否则它将指向一个指地址,这是指针的大忌 //long (*func1)(int); //该语句声明了一个指针,该指针指向一个函数 //long* func1(int); //该语句声明了一个函数,返回一个long型的指针 //我们来比较一下这两种声明: //long(*func1)(int); //声明了一个指针,该指针指向一个函数 //long*func1(int); //声明了一个函数,该函数返回一个指针 //重新,定义函数指针 float(*fp)(float&, float&); void(*p)(float&, float&); //取得三角型的面积 float triangle(float &x, float &y) { return x*y*0.5; } float rectangle(float &x, float &y) { return x*y; } void swap(float &x, float &y) { float n; n=x; x=y; y=n; } void print(float &x, float &y) { cout<<"长为:"<<x<<" "<<"宽:"<<y<<endl; } //只能是顺随的问题了,如果指check放在get的后面,执行失败,这可能需要的不是这种直接定义,页是先声明,然后定义 void get(float &x, float &y) { cout<<"请输入x的新值:"<<endl; string str1; cin>>str1; while(!check(str1)) { cout<<"你输入的不是数字,请重新输入!!!!!"<<endl; cin>>str1; } x=atof(str1.c_str()); cout<<"请输入y的新值:"<<endl; string str2; cin>>str2; while(!check(str2)) { cout<<"你输入的不是数字,请重新输入!!!!!"<<endl; cin>>str2; } y = atof(str2.c_str()); } bool check(string str) { for(int s=0; s<str.length(); s++) { if((str[s]>'9' || str[s]<'0') && (str[s] != '.') ) { return false; } } return true; } int main() { bool quit = false; float a=2, b=3; int choice; //用来记录用户的选择值 while(quit == false) { cout<<"(0)退出 (1)设定长宽 (2)设定三角形 (3)长方形 (4)交换长宽值:"<<endl; cin>>choice; switch(choice) { case 1: //cout<<"设定前长和宽的值:"<<endl; //print(a,b); //get(a,b); //cout<<"设定后长和宽的值:"<<endl; //print(a,b); p = get; break; case 2: //cout<<"当前长和宽的值:"<<endl; //print(a,b); //cout<<"三角形的面积为:"<<triangle(a,b)<<endl; fp = triangle; break; case 3: //cout<<"当前长和宽的值:"<<endl; //print(a,b); //cout<<"长方形的面积为:"<<rectangle(a,b)<<endl; fp = rectangle; break; case 4: //cout<<"交换前长和宽的值:"<<endl; //print(a,b); //swap(a,b); //cout<<"交换后长和宽的值:"<<endl; //print(a,b); p = swap; break; case 0: quit = true; break; default: quit = true; break; } if(choice == 1 || choice==4) { print(a, b); p(a,b); print(a, b); }else if(choice == 2 || choice==3) { print(a,b); cout<<"面积为:"<<fp(a,b)<<endl; } } return 0; }