第十七章 特殊成员_函数指针
2012-09-16 22:47
501 查看
//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; }
相关文章推荐
- 第十七章 特殊成员_函数指针数组
- 第十七章 特殊成员_函数指针也可以做为参数
- 第十七章 特殊成员_使用typedef简化函数指针的声明
- 第十七章 特殊成员_成员函数指针数组
- 类成员函数指针的特殊之处
- 17:特殊类成员:函数指针5
- 非static成员函数通过类名::来调用,空指针调用成员方法不出错!
- c++成员函数指针的应用
- 成员函数指针的应用 之 仿写OC里面UIButton的回调机制(二)
- 成员函数指针与高性能的C++委托(下篇)
- 类成员函数指针回调问题。(可以回调但是,函数回调后this指针无效)
- 成员函数指针与高性能的C++委托
- 使用纯C函数指针调用C++的类成员函数
- 由类的成员函数深入指针
- 关于在C++内用指针调用类的成员函数
- 类和对象(this指针、默认成员函数及运算符的重载)
- C++模板编程->成员函数指针模板参数
- C++的一些基本功,包括对常量成员函数的一些特殊说明
- 一般函数指针和类的成员函数指针
- 第17章 特殊成员函数