C++类成员函数指针详解与实例
163 浏览量
更新于2024-09-01
收藏 84KB PDF 举报
"C++类的成员函数指针详解与实例"
在C++中,成员函数指针是一个重要的概念,它允许我们直接通过指针来调用类的成员函数,这在处理回调函数、事件驱动编程或者需要动态指定行为时非常有用。成员函数指针与普通函数指针有着显著的区别,因为成员函数有隐含的`this`指针,它是对对象实例的引用。
成员函数指针的声明格式是`R(T::*)()`,其中`R`代表返回类型,`T`是类的名称,而空括号`()`表示函数没有参数。例如,如果你有一个名为`MyClass`的类,有一个返回`int`并接受两个`int`参数的成员函数`myFunc`,那么它的成员函数指针类型声明如下:
```cpp
int (MyClass::*myFuncPtr)(int, int);
```
成员函数指针不能直接转换为普通函数指针,因为它们携带了额外的信息,即`this`上下文。这意味着,要使用成员函数指针调用成员函数,必须有对应的类对象实例。例如:
```cpp
MyClass obj;
int result = (obj.*myFuncPtr)(1, 2); // 使用成员函数指针调用成员函数
```
在C++标准库中,有些函数如`qsort`需要传递比较函数的指针。如果成员函数需要作为比较函数,可以使用成员函数指针。但是,`qsort`期望的是全局或静态成员函数的指针,因为它不涉及特定对象的`this`指针。为了实现这个功能,通常会使用`std::function`或者`std::bind`来封装成员函数,使其看起来像一个无状态的函数对象。
以下是将成员函数指针赋值给非成员函数指针的示例:
```cpp
#include <iostream>
class Test1 {
public:
void memberFun1() { std::cout << "Calling Test1::memberFun1 OK" << std::endl; }
};
typedef void (*Function1)();
Function1 f1 = &Test1::memberFun1; // 将成员函数指针赋值给非成员函数指针
int main() {
Test1 test;
(test.*f1)(); // 通过非成员函数指针调用成员函数
return 0;
}
```
在这个例子中,`f1`是一个非成员函数指针,但它存储了`Test1`类的`memberFun1`成员函数的地址。通过`test.*f1()`,我们可以间接调用`test`对象的`memberFun1`函数。
C++中的成员函数指针是一种强大的工具,用于动态绑定行为到对象上。虽然它比C语言中的指针更为复杂,但提供了更多的灵活性和类型安全性。正确理解和使用成员函数指针是掌握C++高级特性的关键步骤。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-12-31 上传
2020-09-05 上传
2020-08-31 上传
2020-07-03 上传
2020-09-05 上传
2020-08-30 上传
weixin_38612568
- 粉丝: 3
- 资源: 897
最新资源
- 【Java毕业设计】... 导及实践教程(21世纪高等学校规划教材·计算机科学与技术)》PDF下载_卢玲等编著,《新.zip
- cracking-solutions
- django实现好客租房后台系统源码.zip
- seipoc
- phenomenon
- fundamentos-nodejs:进行基础知识开发Node.js,无需Bootcamp GoStack
- webserver-skeleton:具有服务器端模板渲染的Web服务器应用程序的框架
- 新唐 M0516 核心转接板 BSP 和程序、原理图、手册等-电路方案
- android-auth-manager:处理 Android 中与 AccountManager 交互所需的大部分问题,并提供一种机制,用于将用户存储在您的应用程序中的 AccountManager 中,并在必要时自动刷新 OAuth2 令牌
- Chill-my-NIS-new:Chill我的NIS不和谐服务器的新网站。 2小时内完成
- tomyfutureself
- DesugarFirestoreTestIssue
- lab-quieter-reporter:满足覆盖率阈值时输出的错误更少
- M0518 六爪机器人设计(视频演示、代码、手机端apk、原理图、PCB)-电路方案
- liferay-spring-mvc-portlet:Liferay Spring MVC portlet 的项目模板
- Windows超级管理器