,,C++普通函数指针与成员函数指针实例解析

,,C++普通函数指针与成员函数指针实例解析

本文主要介绍C常用函数指针和成员函数指针,这是非常重要的知识点。有需要的朋友可以参考一下。

c的函数指针是通过指向函数的指针间接调用函数。我相信很多人使用函数指针指向一般函数,但是对于函数指针指向类成员函数并不熟悉。本文通过实例分析了C语言的常用函数指针和成员函数指针。

一、普通函数指针

我们通常所说的函数指针是指指向普通函数的指针。和其他指针一样,函数指针指向特定的类型,同一个指针使用的所有函数必须有相同的参数类型和返回类型。

int (*pf)(int,int);//声明一个函数指针

这里pf指向的函数类型是int (int,int),即函数的参数是两个int类型,返回值也是int类型。

注意:* pf两端的括号必不可少。如果不写这对括号,PF就是一个返回值是int指针的函数。

#includeiostream

#includestring

使用命名空间std

typedef int (*pFun)(int,int);//typedef是一种类型。

int add(int a,int b){

返回a b;

}

int mns(int a,int b){

返回a-b;

}

字符串合并(常量字符串s1,常量字符串s2){

返回s1 s2

}

int main()

{

pFun pf1=add

cout (*pf1)(2,3)endl;//调用add函数

pf1=mns

cout (*pf1)(8,1)endl;//调用mns函数

string (*pf2)(常量字符串,常量字符串)=merge

cout (*pf2)('hello ',' world ')endl;//调用合并函数

返回0;

}

比如在示例代码中,直接声明函数指针变量冗长繁琐,我们可以使用typedef来定义自己的函数指针类型。另外,函数指针也可以作为函数的形参类型,实参可以直接使用函数名。

二、成员函数指针

成员函数指针是指可以指向类的非静态成员函数的指针。该类的静态成员不属于任何对象,因此不需要指向静态成员的特殊指针。指向静态成员的指针与普通指针没有区别。与普通函数指针不同,成员函数指针不仅指定目标函数的参数列表和返回类型,还指示成员函数所属的类。因此,我们必须在*前添加classname:来表示当前定义的指针指向classname的成员函数:

int (A:*pf)(int,int);//声明成员函数指针

同样,A:*pf两端的括号在这里也是必不可少的。如果没有这样的括号,pf就是一个返回A类数据成员(int类型)指针的函数。注意:与普通的函数指针不同,成员函数与指向该成员的指针之间没有自动转换规则。

pf=A:add;//正确:必须显式使用寻址运算符()

pf=A:add;//错误

当我们初始化一个成员函数指针时,它指向类的一个成员函数,但是我们不指定成员所属的对象——。我们不提供成员所属的对象,直到我们使用成员函数指针。下面是一个使用成员函数指针的例子:

A类;

typedef int (A:*pClassFun)(int,int);//成员函数指针类型

A级

公共:

int add(int m,int n){

cout m ' ' n '=' m n endl

返回m ^ n;

}

int mns(int m,int n){

cout m '-' n '=' m-n endl;

返回m-n;

}

int mul(int m,int n){

cout m ' * ' n '=' m * n endl

返回m * n;

}

int dev(int m,int n){

cout m '/' n '=' m/n endl;

返回m/n;

}

int call(pclassffun fun,int m,int n){//类内部接口

return (this-*fun)(m,n);

}

};

Int call (a obj,pclass fun fun,int m,int n){//类外部接口

return (obj。*fun)(m,n);

}

int main()

{

A a

“cout”成员函数“call”:“endl;

a.call(A:add,8,4);

a.call(A:mns,8,4);

a.call(A:mul,8,4);

a.call(A:dev,8,4);

“cout”外部函数“call”:“endl;

调用(A,A:add,9,3);

call(a,A:mns,9,3);

call(a,A:mul,9,3);

call(a,A:dev,9,3);

返回0;

}

如示例所示,我们还可以使用typedef来定义成员函数指针的类型别名。另外,我们需要注意函数指针的使用:对于普通的函数指针,我们是这样使用(*pf)(arguments)的,因为要调用一个函数,首先要解引用函数指针,而函数调用运算符()的优先级更高,所以(*pf)的括号必不可少;对于成员函数指针,唯一的区别是需要在对象上调用函数,所以只需要添加一个成员访问器:

(obj。*pf)(参数)//obj是一个对象

(objptr-*pf)(arguments) //objptr是一个对象指针。

三、函数表驱动

对于普通的函数指针和指向成员函数的指针,一种常见的用法是将它们存储在函数表中。当一个程序需要执行一个特定的函数时,它从表中查找对应的函数指针,用指针调用对应的程序代码。这就是函数指针在表驱动方法中的应用。

表驱动方法是通过查找表来获取信息。一般在数据不多时,可以用逻辑判断语句(if…else或switch…case)获取信息;但是随着数据的增加,逻辑语句会越来越长,此时表驱动方法的优势就体现出来了。

#includeiostream

#includestring

#includemap

使用命名空间std

A类;

typedef int (A:*pClassFun)(int,int);

A级

公共:

一个(){ //构造函数,正在初始化表

表[' ']=A:add;

表['-']=A:MnS;

表[' * ']=A:mul;

table['/']=A:dev;

}

int add(int m,int n){

cout m ' ' n '=' m n endl

返回m ^ n;

}

int mns(int m,int n){

cout m '-' n '=' m-n endl;

返回m-n;

}

int mul(int m,int n){

cout m ' * ' n '=' m * n endl

返回m * n;

}

int dev(int m,int n){

cout m '/' n '=' m/n endl;

返回m/n;

}

//查找表格并调用相应的函数

int call(string s,int m,int n){

返回(this-*table[s])(m,n);

}

私人:

mapstring,pClassFun表;//功能表

};

//测试

int main()

{

A a

a.call(“”,8,2);

a . call(“-”,8,2);

a.call('* ',8,2);

a.call('/',8,2);

返回0;

}

以上就是一个例子。例子中的“表”是用map实现的(当然也可以用数组)。使用表驱动法时,要注意:一是如何查表并从中读取正确的数据;第二个是存储在表中的内容,比如数值或函数指针。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: