成员函数指针C++类成员函数如何赋值给函数指针
成员函数指针 时间:2021-06-02 阅读:(
)
常成员函数怎么用指针调用啊
C++中,不是常对象也可以调用常成员函数。
(1) 常对象
用const修饰的对象叫对象常量,其格式如下:
〈类名〉const 〈对象名〉 或者 const 〈类名〉〈对象名〉
声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。
例:分析下列错误的地方,说明理由:
#include
class Point
{ int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<
所谓常引用是指说明引用时用const修饰。
常引用所引用的对象不能被更
新,一般用做形参。
其格式:
const 〈类型说明〉&〈引用名〉
例:根据例题5-11的类给出程序的执行结果:
#include
int length(const Point &p1, const Point &p2)
{ int l;
l=sqrt((p1.x -p2.x)* (p1.x -p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
return l;
}
void main( )
{
Point a(1,1),b(4,5);
Cout<<"两点的距离是:"<
其格式如下:
〈类型〉〈函数名〉(〈参数表〉)const;
常成员函数的作用和功能:
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数。
常对象只能调用类的常成员函数
以及类的静态成员函数。
例:给出下列程序的执行结果:
#include
class Point
{ int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print()const { cout<<"x="<
C++中怎么获取类的成员函数的函数指针
虾米意思?是指类的成员变量是否可以指向类中的成员函数吗?如果这样子的,类的成员函数指针就是用来起这个作用,mfc消息路由机制也是机遇此原理。
#include <stdio.h>class A{public: A() // Ctor { m_pfn1 = A::foo; // 有没有取地址符号一样 m_pfn2 = &A::bar; (this->*m_pfn1)(); (this->*m_pfn2)(0); } void foo(){printf("foo
");} // 类函数 virtual void bar(int){printf("bar
");} void (A::*m_pfn1)(); // 类函数指针成员变量 void (A::*m_pfn2)(int); // 类函数指针成员变量};int _tmain(int argc, _TCHAR* argv[]){ // 1. 类函数指针成员变量的使用 A a; A* p = &a; (a.*(a.m_pfn1))(); (a.*(a.m_pfn2))(0); // 多态 (p->*(p->m_pfn1))(); (p->*(p->m_pfn2))(0); // 多态 // 2. 类外函数指针变量的使用 typedef void (A::*MemFunPtr)(); MemFunPtr memPtr = &A::foo; (a.*memPtr)(); (p->*memPtr)(); return 0;}
补充:
->* 和.* 是C++新增加的操作符号,专用类成员指针变量取址(成员函数指针,成员变量指针)
如何使用指向类的成员函数的指针
指向函数的指针的用法:
1.指向函数的指针的类型
指向函数的指针应该怎样声明?拿两个字符串的比较函数来说:
int strCompare(const string & s1, const string & s2) ;
如果两个字符串相等就返回0,否则,s1< s2返回负数,s1 > s2返回正数其实函数名不是其类型的一部分,函数类型是只由它的返回类型和参数来决定。
函数名称只不过是指向函数代码的地址。
所以指向函数的指针的类型应该用下面的形式声名:
int (*pf)( const string &, const string & );
2.初始化和赋值
指向函数的指针可如下被初始化只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型
完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息在指向函数
类型的指针之间不存在隐式类型转换。
int (*pfi)( const string &, const string & ) = strCompare;
int (*pfi2)( const string &, const string & ) = &strCompare;
指向函数的指针可以如下被赋值
pfi = strCompare;
pfi2 = pfi;
3.调用
如下代码:
#include <iostream>
using namespace std;
int min( int*, int );
int (*pf)( int*, int ) = min;
const int iaSize = 5;
int ia[ iaSize ] = { 7, 4, 9, 2, 5 };
int main()
{
cout << "Direct call: min: "
<< min( ia, iaSize ) << endl;
cout << "Indirect call: min: "
<< pf( ia, iaSize ) << endl;
return 0;
}
int min( int* ia, int sz )
{
int minVal = ia[ 0 ];
for ( int ix = 1; ix < sz; ++ix )
if ( minVal > ia[ ix ] )
minVal = ia[ ix ];
return minVal;
}
4.函数指针的数组
我们可以声明一个函数指针的数组例如
int (*testCases[10])();
将testCases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针,该函数没有参数返回类型为int。
上面的声明等价于下面声明:
typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];
函数指针的数组可以用一个初始化列表来初始化该表中每个初始值都代表了一个与数
组元素类型相同的函数例如
int lexicoCompare( const string &, const string & );
int sizeCompare( const string &, const string & );
typedef int ( *PFI2S )( const string &, const string & );
pareFuncs[2] =
{
lexicoCompare,
sizeCompare
};
// 两个等价的调用
pfCompare[ 0 ]( string1, string2 ); // 编写
((*pfCompare)[ 0 ])( string1, string2 ); // 显式
5,参数和返回类型
函数参数的类型不能是函数类型函数类型的参数将被自动转换成该函数类型的指针
例如
// typedef 表示一个函数类型
typedef int functype( const string &, const string & );
void sort( string *, string *, functype );
编译器把sort()当作已经声明为
void sort( string *, string *,
int (*)( const string &, const string & ) );
上面这两个sort()的声明是等价的
注意除了用作参数类型之外函数指针也可以被用作函数返回值的类型例如
int (*ff( int ))( int*, int );
该声明将ff()声明为一个函数它有一个int 型的参数返回一个指向函数的指针类型
为
int (*) ( int*, int );
同样使用typedef 名字可以使声明更容易读懂例如下面的typedef PF 使得我们能更
容易地分解出ff()的返回类型是函数指针
typedef int (*PF)( int*, int );
PF ff( int );
函数不能声明返回一个函数类型如果是则产生编译错误例如函数ff()不能如下
声明
// typedef 表示一个函数类型
typedef int func( int*, int );
func ff( int ); // 错误: ff()的返同类型为函数类型C++怎样实现一个类的函数指针成员指向这个类的成员函数?
声明类名
定义类型
声明类体
类似于
class MyClass;
typedef void (MyClass::*PFunc) (int);
class MyClass
{
public:
void Func1(int);
void Func2(int);
PFunc func;
};
你可以试试C++类成员函数如何赋值给函数指针
1.一个指向外部函数的指针声明为:
void(*pf)(char*,constchar*);
void strcpy(char* dest,constchar* source);
pf=strcpy;
2.一个指向类a成员函数的指针声明为:
void(a::*pmf)(char*,constchar*);
物语云计算(MonogatariCloud)是一家成立于2016年的老牌国人商家,主营国内游戏高防独服业务,拥有多家机房资源,产品质量过硬,颇有一定口碑。本次带来的是美国圣何塞 Equinix 机房的高性能I9-10980XE大带宽VPS,去程CN2GIA回程AS9929,美国原生IP,支持解锁奈飞等应用,支持免费安装Windows系统。值得注意的是,物语云采用的虚拟化技术为Hyper-V,资源全...
青云互联怎么样?青云互联是一家成立于2020年6月的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,目前提供有美国免费主机、香港主机、香港服务器、美国云服务器,让您的网站高速、稳定运行。美国cn2弹性云主机限时8折起,可选1-20个IP,仅15元/月起,附8折优惠码使用!点击进入:青云互联官方网站地址青云互联优惠码:八折优惠码:ltY8sHMh (续费同价)青云互联活动方案:美国洛杉矶...
DiyVM是一家低调国人VPS主机商,成立于2009年,提供的产品包括VPS主机和独立服务器租用等,数据中心包括香港沙田、美国洛杉矶、日本大阪等,VPS主机基于XEN架构,均为国内直连线路,主机支持异地备份与自定义镜像,可提供内网IP。最近,商家对香港机房VPS提供5折优惠码,最低2GB内存起优惠后仅需50元/月。下面就以香港机房为例,分享几款VPS主机配置信息。CPU:2cores内存:2GB硬...
成员函数指针为你推荐
腾讯举报中心怎么通过腾讯反诈骗中心举报QQmac地址克隆无线路由器mac地址克隆有什么用处?华为总裁女儿为啥姓孟总裁文女主姓孟,女主父母抱错孩子,后来将错就错,养父母对女主很好seo优化技术做seo需要懂什么技术?12种颜色十二种颜色的英文怎么读?网络电话永久免费打有没有永久免费的网络电话印度尼西亚国家代码手机上的国家代码是什么assemblyinfoLOL的 X、L、CS 是什么意思天翼校园宽带校园天翼宽带是什么上网类型超级播放器一共有哪些播放器?
草根过期域名 ion idc测评网 mediafire下载 dux 数字域名 日本bb瘦 135邮箱 gtt 移动服务器托管 视频服务器是什么 架设邮件服务器 东莞服务器托管 云服务器比较 免费蓝钻 xuni 如何登陆阿里云邮箱 国外免费云空间 锐速 ncp是什么 更多