c++-类成员函数-常用运算-取成员函数地址-动态调用-申明
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
类的成员函数是对象使用非常重要的方式在C++的一些高级技巧里非常有必要了解清楚。本文主要介绍类成员函数地址类成员函数申明类成员指针与函数的动态绑定。
1.取成员函数地址
当C++类对象中的成员函数转成汇编代码时成员函数的特点与普通函数并没有特别区别只是采用的调用方式有些不同而已。普通函数可以直接用函数名当作函数地址。而成员函数有其严格的要求先看一段范例代码
class ClassName {
public:
int f1(int val) {
return val + 2;
}
};
void test() {
int (ClassName::*pmf)(int) = &ClassName::f1;
ClassName c; //.*的用法经由对象调用
(c.*pmf)(5); // A
ClassName *pc = &c; //->*的用法经由对象指针调用
(pc->*pmf)(6); // B
}
注意获取一个成员函数指针的语法要求很严格
- 不能使用括号例如&(ClassName::foo)不对。
- 必须有限定符例如&foo不对。即使在类ClassName的作用域内也不行。
- 必须使用取地址符号例如直接写ClassName::foo不行。虽然普通函数指针可以这样
所以必须要这样写&ClassName::foo。
2.成员函数类型申明
可以像普通函数一样采用typedef运算符将函数指针类型重命名这样更好看一些。
class ClassName {
public:
int f1(int val) {
return val + 2;
}
};
typedef int (ClassName::*PMF)(int);
void test() {
PMF pmf = &ClassName::f1;
}
3.动态绑定
对象动态调用符号.*对象指针动态调用符号->*。上面的源码已经展示这里就不再重复。
ClassName c; //.*的用法经由对象调用
(c.*pmf)(5); // A
ClassName *pc = &c; //->*的用法经由对象指针调用
(pc->*pmf)(6); // B
动态绑定在需要根据字符串动态选择对象不同成员函数调用时可以使用。也可以在逆向插入代码时用获取的对象指针来调用其特定的成员函数指针。
4.作者答疑
如有疑问敬请留言。