看运算符重载的时候,看到这一句
.* :: 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
总结
- 成员函数指针是一种高级功能,常见于框架设计或动态调用类的成员函数。
- 使用成员函数指针时要结合具体对象,不能像普通函数指针直接调用。