C++成员指针的正确定义是什么?解析代码中两行语句的含义
C++成员指针详解
一、成员数据指针:int (Foo :: * ptr);
这行代码定义了一个指向Foo类中int类型成员变量的指针。
- 语法拆解:
Foo::*表明这是属于Foo类的成员指针,int是该成员变量的类型,括号用于明确优先级(避免歧义,不加括号的int Foo::* ptr写法也合法,但加括号可读性更强)。 - 使用规则:
- 赋值:必须通过
&Foo::成员名获取成员变量的地址,比如ptr = &Foo::a;。 - 访问:通过
对象.*指针的形式操作成员,比如foo.*ptr = 123;等价于直接修改foo.a。
- 赋值:必须通过
二、成员函数指针:int (Foo :: * ptr) ();
这行代码定义了一个指向Foo类中返回值为int、无参数的成员函数的指针。
- 语法拆解:
(Foo::*ptr)明确这是成员指针,后面的()表示该指针指向无参数的函数,int是函数返回值类型。这里的括号是必须的——如果省略,int Foo::*ptr()会被解析成“返回指向Foo类int成员指针的普通函数”,完全偏离原意。 - 使用规则:
- 赋值:同样用
&Foo::成员函数名获取函数地址,比如ptr = &Foo::a;。 - 调用:必须用括号把
对象.*指针括起来再调用,比如(foo.*ptr)();等价于直接调用foo.a();。这是因为函数调用()的优先级高于成员指针运算符.*,不加括号会触发语法错误。
- 赋值:同样用
三、成员指针的正确定义规范
成员数据指针
格式:成员类型 (类名::*指针变量名);
等价简化写法:成员类型 类名::*指针变量名;
成员函数指针
格式:返回值类型 (类名::*指针变量名)(参数列表);
注意:参数列表要和目标成员函数完全匹配(包括参数类型、数量、const属性等),且外层括号不能省略。
关于调试无效的说明
你提供的代码中出现了&,这是HTML转义后的字符,实际编译时需要替换为&(即ptr = &Foo::a;而非ptr = &Foo::a;),否则会触发语法错误,导致无法正常编译调试。
内容的提问来源于stack exchange,提问作者20MikeMike
相关产品推荐
相关产品推荐

