C++法則22:運算符 ::* 和 ->* 和 ::* 是獨特的整體運算符,是不可分的。
1.?::*
(成員指針聲明符)
作用:用于聲明一個指向類成員的指針。
語法:
ReturnType (ClassName::*pointerName) = &ClassName::MemberName;
示例:
class MyClass { public:int value;void print() { std::cout << value; } };// 指向成員的指針 int MyClass::*ptr_to_value = &MyClass::value; void (MyClass::*ptr_to_func)() = &MyClass::print;
2.?->*
(通過對象指針訪問成員指針)
作用:通過對象指針(
ClassName*
)和成員指針(ClassName::*
)訪問成員。語法:
(objectPtr->*memberPointer)
示例:
MyClass obj; MyClass* objPtr = &obj;// 通過 ->* 訪問成員 (objPtr->*ptr_to_value) = 42; // 等價于 obj.value = 42 (objPtr->*ptr_to_func)(); // 調用 obj.print()
3.?.*
(通過對象訪問成員指針)
作用:通過對象(
ClassName
)和成員指針(ClassName::*
)訪問成員。語法:
(object.*memberPointer)
示例:
MyClass obj;// 通過 .* 訪問成員 (obj.*ptr_to_value) = 42; // 等價于 obj.value = 42 (obj.*ptr_to_func)(); // 調用 obj.print()
關鍵點:
不可分割性:
::*
、->*
?和?.*
?是獨立的運算符,不能拆開(例如?->*
?不是?->
?和?*
?的組合)。它們的優先級和結合性是語言規定的,與其他運算符不同。
成員指針的特殊性:
成員指針不是普通指針,而是與類關聯的“偏移”或“訪問方式”。
需要結合對象或對象指針才能實際訪問成員。
使用場景:
常用于回調、泛型編程或需要動態選擇成員的情況。
完整示例:
#include <iostream>class MyClass {
public:int value = 0;void print() { std::cout << "Value: " << value << std::endl; }
};int main() {// 聲明成員指針int MyClass::*ptr_to_value = &MyClass::value;void (MyClass::*ptr_to_func)() = &MyClass::print;MyClass obj;MyClass* objPtr = &obj;// 通過 .* 訪問(obj.*ptr_to_value) = 10;(obj.*ptr_to_func)();// 通過 ->* 訪問(objPtr->*ptr_to_value) = 20;(objPtr->*ptr_to_func)();return 0;
}
輸出:
text
Value: 10 Value: 20