看運算符重載的時候,看到這一句
.*? ?::? ?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指向函數funcOB 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; // 輸出 100return 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
總結
- 成員函數指針是一種高級功能,常見于框架設計或動態調用類的成員函數。
- 使用成員函數指針時要結合具體對象,不能像普通函數指針直接調用。