当前位置: 首页 > news >正文

C++中的.*运算符

看运算符重载的时候,看到这一句

.*   ::   sizeof   ?:    . 注意以上5个运算符不能重载。

  ::   sizeof   ?:    . 这四个好理解,毕竟都学过,但.*是什么?

于是自己整理了一下

.* 是一种 C++ 中的运算符,称为指针到成员操作符。它用于访问类成员指针所指向的成员变量或成员函数,结合一个对象或对象指针一起使用。

 给段代码

class OB{
public:
	void func(){
		cout << "void func()" << endl;
	}
};

typedef void(OB::*PtrFunc)() ;//成员函数指针类型

int main(){
	// 函数指针
	// void (*ptr)();

	// 成员函数要加&才能取到函数指针
	PtrFunc fp = &OB::func;//定义成员函数指针p指向函数func

	OB temp;//定义ob类对象temp

	(temp.*fp)();
	

	return 0;
}

前面应该都没问题,直接看到这一句来

	(temp.*fp)();

使用成员函数指针调用 temp 的成员函数 func

temp.*fp 表示:对对象 temp 使用成员函数指针 fp 指向的函数。

所以大概就是用与这种场合?

当然前面提到,这也可以用在成员变量指针上

#include <iostream>
using namespace std;

class Test {
public:
    int x;
    int y;
};

int main() {
    Test obj;
    obj.x = 10;
    obj.y = 20;

    // 定义成员变量指针
    int Test::*ptr = &Test::x;

    // 使用 .* 访问 obj 中的成员变量
    cout << "Value of x: " << obj.*ptr << endl; // 输出 10

    // 修改成员变量值
    obj.*ptr = 100;
    cout << "Updated x: " << obj.x << endl;    // 输出 100

    return 0;
}
几点需要注意的地方:

1.成员函数指针 vs 普通函数指针

  • 普通函数指针不能指向成员函数,因为成员函数需要 this 指针来调用,而普通函数没有这个需求。
  • 成员函数指针需要结合对象(如 (temp.*fp))才能使用。

2.取地址时需要加 &

  • 取类成员函数地址时必须加 &,如 &OB::func
  • 普通函数指针可以省略 &

3.调用成员函数时需要通过对象:

  • (temp.*fp)() 是基于对象 temp 来调用的。
  • 如果对象是指针,则需要用 ->* 运算符调用成员函数: 
    OB* objPtr = &temp;
    (objPtr->*fp)();
    

4.成员函数的参数与返回值:

  • 如果成员函数有参数,调用时需要提供实参:
    typedef void(OB::*PtrFuncWithArgs)(int);
    void OB::funcWithArgs(int x) { cout << x << endl; }
    PtrFuncWithArgs fp = &OB::funcWithArgs;
    (temp.*fp)(42); // 输出 42
    
总结
  • 成员函数指针是一种高级功能,常见于框架设计或动态调用类的成员函数。
  • 使用成员函数指针时要结合具体对象,不能像普通函数指针直接调用。

相关文章:

  • 23种设计模式 - 抽象工厂模式
  • 23种设计模式 - 工厂方法模式
  • 智能选路+NAT实验
  • Linux驱动学习(二)--字符设备
  • 力扣-二叉树-700 二叉搜索树中的搜索
  • Springboot接口返回的时间和数据库差了八小时
  • ctfshow web入门 web11-web24
  • Android GreenDAO 适配 AGP 8.0+
  • 使用 Redis 实现 RBAC 权限管理
  • Python毕业设计选题:基于python的酒店推荐系统_django+hadoop
  • 腾讯云ChatBI通过中国信通院大模型驱动的智能数据分析工具专项测试
  • Myplater项目
  • @RestController和@RequestBody注解含义
  • 出现 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp 解决方法
  • VSCode本地python包“无法解析导入”
  • 千峰React:脚手架准备+JSX基础
  • Python 文件操作利器:FileUtils 工具类深度剖析
  • 赛前启航 | Azure 应用开发实战指南:开启创意的无限可能
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 15
  • 工业安全的智能哨兵:AI如何筑起生产线的“数字防火墙“
  • 商务部:中方愿同各国一道加强合作,促进跨境电商健康可持续发展
  • 万达电影:股东杭州臻希拟减持不超1.3927%公司股份
  • 上交现场配乐4K修复版《神女》:默片巅峰有了新的打开方式
  • 2025江西跨境电子商务发展交流会召开,探索行业发展新趋势
  • 美联储主席:美联储工作方式不会受特朗普影响,从未寻求与总统会面
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)