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

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++的成员指针机制至关重要!

http://www.dtcms.com/a/308938.html

相关文章:

  • 从关键词到用户意图:2025年Google Trends的语义化SEO实战手册
  • 化学结构式解读指南:从基础认知到InDraw智能识别
  • 大小端字节序详解
  • LCGL使用简介
  • Kubernetes架构概览
  • 2025虚幻5光明之魂开发思考1——借鉴软件工程
  • Dify 从入门到精通(第 6/100 篇):配置你的第一个 LLM:OpenAI、Claude 和 Ollama
  • kafka使用kraft
  • QT 动态属性和静态属性
  • Spring框架与AutoCAD结合应用
  • 2025年6月人工智能领域研究热点扫描|人工智能顶级期刊TPAMI
  • vue3 v-html绑定数据,点击sub实现popover效果
  • kamailio uac_req_send()
  • 项目中如何定义项目范围
  • 【Kiro Code 从入门到精通】重要的功能
  • 删除无效索引:提升写入性能的维护技巧
  • Linux日志管理与时间同步
  • 05 GWAS表型数据处理原理
  • Protobuf动态解析
  • 蓝牙耳机充不进去电怎么办?以换代修更简单!
  • 八股训练--Spring
  • Spring Batch参数校验失败问题分析:JobParametersValidator校验了两次JobParametersIncrementer的参数
  • 详解Vite 配置中的代理功能
  • JavaScript内存管理完全指南:从入门到精通
  • 智能化问题分析(Cherry Stdio+ MCP)
  • VS2022将.net4.8工程升级到.net6.0
  • 蚂蚁财富招Java高级研发
  • 基于deepseek的文本解析 - 超长文本的md结构化
  • AD域设计与管理-域策略-进阶
  • logging格式化输出日志asctime等详解