C++法则22:运算符 ::* 和 ->* 和 ::* 是独特的整体运算符,是不可分的。

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()

关键点:

  1. 不可分割性

    • ::*->* 和 .* 是独立的运算符,不能拆开(例如 ->* 不是 -> 和 * 的组合)。

    • 它们的优先级和结合性是语言规定的,与其他运算符不同。

  2. 成员指针的特殊性

    • 成员指针不是普通指针,而是与类关联的“偏移”或“访问方式”。

    • 需要结合对象或对象指针才能实际访问成员。

  3. 使用场景

    • 常用于回调、泛型编程或需要动态选择成员的情况。


完整示例:

#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

理解这些运算符的独特性对掌握C++的成员指针机制至关重要!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值