1. 程式人生 > >C++ 特殊類成員 7-- 7函式指標也可以作為函式的引數 8使用typedef簡化函式指標的宣告

C++ 特殊類成員 7-- 7函式指標也可以作為函式的引數 8使用typedef簡化函式指標的宣告

#include <iostream>
using namespace std;
/*---------------------------------
     17-06 7函式指標也可以作為函式的引數 8使用typedef簡化函式指標的宣告
---------------------------------*/
void aquare(float &x,float &y){x=x*x;y=y*y;}
void cube(float &x,float &y){x=x*x*x;y=y*y*y;}
typedef void (*p)(float&,float&);//將整個函式指標重新命名為p
//void print(void (*p)(float&,float&),float &x,float &y) //函式指標也可以作為函式的第一個引數
void print(p vp,float &x,float &y)
{
	cout<<"執行前,長:"<<x<<"\t寬:"<<y<<endl;
	vp(x,y);
	cout<<"執行後,長:"<<x<<"\t寬:"<<y<<endl;
}
void Swap(float &x,float &y){int z;z=x;x=y;y=z;}
int main()
{
	float a=2,b=3;
	char choice ='0';
	int i;
	void (*p[4])(float &x,float &y);
	for(i=0;i<4;i++)
	{
		cout<<"0)退出 1)正方形 2)立方體 3)交換x和y的值:";
		cin>>choice;
		bool quit =false;
		switch(choice)
		{
		case '0':
			quit =true;
			break;
		case '1':
			p[i] =aquare;
			break;
		case '2':
			p[i] =cube;
			break;
		case '3':
			p[i] =Swap;
			break;
		default:
			p[i] =NULL;
			break;
		}
		if(quit)
			break;
		if(p[i]==NULL)
		{
			cout<<"請輸入一個從0到3的數字:\n";
			i--;
			continue;
		}
		cout<<"第"<<i+1<<"次執行:";				
		cout<<"現在呼叫函式指標陣列p["<<i<<"]所指向的函式..."<<endl;
		print(p[i],a,b); //呼叫示例
		cout<<endl;
	}


	return 0;
}

執行結果:

0)退出 1)正方形 2)立方體 3)交換x和y的值:1
第1次執行:現在呼叫函式指標陣列p[0]所指向的函式...
執行前,長:2    寬:3
執行後,長:4    寬:9


0)退出 1)正方形 2)立方體 3)交換x和y的值:2
第2次執行:現在呼叫函式指標陣列p[1]所指向的函式...
執行前,長:4    寬:9
執行後,長:64   寬:729


0)退出 1)正方形 2)立方體 3)交換x和y的值:3
第3次執行:現在呼叫函式指標陣列p[2]所指向的函式...
執行前,長:64   寬:729
執行後,長:729  寬:64


0)退出 1)正方形 2)立方體 3)交換x和y的值:0
Press any key to continue