2012-03-30 73 views
5

我在读一个基本的C++教程时,我在下面的代码面临是什么:: *在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 

你能帮助我吗?

谢谢。

+6

“基本”C++教程?没有“基本”的C++任何东西都应该覆盖成员指针。你有链接到该教程? – 2012-03-30 08:27:04

+0

@NicolBolas可能不是很基本的:) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman 2012-03-30 08:39:15

回答

6

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

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

在此之后,当你有一个随机AB对象,您可以访问point_i2

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

point_i2上述初始化之后,这将改变b.i成员。

ClassName::*像你想的&*以同样的方式想:这只是一个“指针/引用状工具”,你可以在声明中使用指定什么你声明的东西将是。

+0

那么这就像一个“成员类指针”?就像方法类指针一样? – Gui13 2012-03-30 08:25:02

+4

用简单的话来说。 *指向一个班级成员*。 – 2012-03-30 08:25:14

+0

@Gui什么是方法类指针?你的意思是'FunctionType A :: *'?是的,他们是一样的。指向数据成员的指针具有成员类型为对象类型,而指向成员函数的指针具有成员类型为函数类型。在语法上,您还可以使用函数类型的函数声明语法,使其看起来像'R(A :: *)(参数)cv-qual ref-qual except-spec'。尽管如果你不熟悉C++语法,使用别名模板和编写别名 A :: *')更容易。 – 2012-03-30 08:25:39