您的位置:首页 > 其它

第十七章 特殊成员_函数指针

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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: