You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++成员指针的正确定义是什么?解析代码中两行语句的含义

C++成员指针详解

一、成员数据指针:int (Foo :: * ptr);

这行代码定义了一个指向Foo类中int类型成员变量的指针。

  • 语法拆解:Foo::*表明这是属于Foo类的成员指针,int是该成员变量的类型,括号用于明确优先级(避免歧义,不加括号的int Foo::* ptr写法也合法,但加括号可读性更强)。
  • 使用规则:
    1. 赋值:必须通过&Foo::成员名获取成员变量的地址,比如ptr = &Foo::a;。
    2. 访问:通过对象.*指针的形式操作成员,比如foo.*ptr = 123;等价于直接修改foo.a。

二、成员函数指针:int (Foo :: * ptr) ();

这行代码定义了一个指向Foo类中返回值为int、无参数的成员函数的指针。

  • 语法拆解:(Foo::*ptr)明确这是成员指针,后面的()表示该指针指向无参数的函数,int是函数返回值类型。这里的括号是必须的——如果省略,int Foo::*ptr()会被解析成“返回指向Foo类int成员指针的普通函数”,完全偏离原意。
  • 使用规则:
    1. 赋值:同样用&Foo::成员函数名获取函数地址,比如ptr = &Foo::a;。
    2. 调用:必须用括号把对象.*指针括起来再调用,比如(foo.*ptr)();等价于直接调用foo.a();。这是因为函数调用()的优先级高于成员指针运算符.*,不加括号会触发语法错误。

三、成员指针的正确定义规范

成员数据指针

格式:成员类型 (类名::*指针变量名);
等价简化写法:成员类型 类名::*指针变量名;

成员函数指针

格式:返回值类型 (类名::*指针变量名)(参数列表);
注意:参数列表要和目标成员函数完全匹配(包括参数类型、数量、const属性等),且外层括号不能省略。

关于调试无效的说明

你提供的代码中出现了&,这是HTML转义后的字符,实际编译时需要替换为&(即ptr = &Foo::a;而非ptr = &Foo::a;),否则会触发语法错误,导致无法正常编译调试。

内容的提问来源于stack exchange,提问作者20MikeMike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:31:02