C++中的::*是什么?

16

我在学习C++基础教程时遇到了一个问题

::*

在下面的代码中,请问那是什么:

class A {
public:
protected:
  int i;
};


class B : public A {
  friend void f(A*, B*);
  void g(A*);
};

void f(A* pa, B* pb) {
//  pa->i = 1;
  pb->i = 2;

//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}

void B::g(A* pa) {
//  pa->i = 1;
  i = 2;

//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}

void h(A* pa, B* pb) {
//  pa->i = 1;
//  pb->i = 2;
}

int main() { }

根据我目前的C++知识,类似于以下内容是什么意思?

int A::* point_i2

8
“基础”的C++教程?任何“基础”的C++内容都不应包括成员指针。你有这个教程的链接吗? - Nicol Bolas
@NicolBolas 可能不是很基础 :) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm - rahman
1
https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members - KaiserKatze
2个回答

12

point_i2是一个成员指针。这意味着它指向在类A中声明的一个int成员变量。


6
int A::* point_i2 = &B::i;

在这之后,当你有一个随机的AB对象时,你可以访问point_i2指向的成员。

B b;
b.*point_i2 = ...;

在上述对point_i2的初始化后,这将更改b.i
ClassName::*视为&*的方式:它只是另一种可以在声明中使用的“指针/引用类工具”,用于指定您要声明的内容。

这就像是一个“成员类指针”吗?就像方法类指针一样? - Gui13
4
一个指向类成员的指针。 - Alok Save
@Gui 什么是方法类指针?你是指 FunctionType A::* 吗?是的,它们是一样的。数据成员指针的成员类型是对象类型,而成员函数指针的成员类型是函数类型。在语法上,您还可以使用函数声明符号语法来使其看起来像 R (A::*)(parameters) cv-qual ref-qual except-spec。虽然如果您不熟悉 C++ 语法,使用别名模板并编写 alias<R(parameters) cv-qual ref-qual except-spec> A::* 更容易。 - Johannes Schaub - litb
@Johannes:SO上没有更清晰的解释:http://mdzahidh.wordpress.com/2008/07/16/pointer-to-c-class-methods-or-should-you-call-em-method-pointers/ - Gui13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接