什么是指针 – 成员 – > *和。*运算符在C ++中?

是的,我已经看到这个问题和这个常见问题 (错误的链接) ,但我仍然不明白什么->*.*在C ++中的意思。
这些页面提供了有关运营商的信息(如超载),但似乎没有解释清楚它们什么。

什么是C ++中的“ ->*和“ .* ,以及什么时候需要使用它们->.

我希望这个例子能为你解决问题

 //we have a class struct X { void f() {} void g() {} }; typedef void (X::*pointer)(); //ok, let's take a pointer and assign f to it. pointer somePointer = &X::f; //now I want to call somePointer. But for that, I need an object X x; //now I call the member function on x like this (x.*somePointer)(); //will call xf() //now, suppose x is not an object but a pointer to object X* px = new X; //I want to call the memfun pointer on px. I use ->* (px ->* somePointer)(); //will call px->f(); 

现在,你不能使用x.somePointer()px->somePointer()因为在类X中没有这样的成员。为此,使用特殊的成员函数指针调用语法…只是自己尝试几个例子,你会习惯的

编辑:顺便说一句, 虚拟成员函数指针变得怪异。

对于成员variables:

 struct Foo { int a; int b; }; int main () { Foo foo; int (Foo :: * ptr); ptr = & Foo :: a; foo .*ptr = 123; // foo.a = 123; ptr = & Foo :: b; foo .*ptr = 234; // foo.b = 234; } 

会员function几乎相同。

 struct Foo { int a (); int b (); }; int main () { Foo foo; int (Foo :: * ptr) (); ptr = & Foo :: a; (foo .*ptr) (); // foo.a (); ptr = & Foo :: b; (foo .*ptr) (); // foo.b (); } 

简而言之:您使用->. 如果你知道你想要访问什么成员。 如果你知道你想要访问什么成员,你可以使用->*.*

一个简单的插入列表的例子

 template<typename ItemType> struct List { List(ItemType *head, ItemType * ItemType::*nextMemPointer) :m_head(head), m_nextMemPointer(nextMemPointer) { } void addHead(ItemType *item) { (item ->* m_nextMemPointer) = m_head; m_head = item; } private: ItemType *m_head; // this stores the member pointer denoting the // "next" pointer of an item ItemType * ItemType::*m_nextMemPointer; }; 

所谓C ++成员的“指针”更像内部的偏移量。 你既需要这样一个成员“指针”,也需要一个对象来引用对象中的成员。 但成员“指针”与指针语法使用,因此名称。

有两种方法可以获得一个对象:你有一个对象的引用,或者你有一个指向对象的指针。

对于引用,使用.*将它与一个成员指针相结合,对于指针,使用->*将它与成员指针结合起来。

但是,通常情况下,如果可以避免使用成员指针,则不要使用成员指针。

他们服从相当违反直觉的规则,并且它们使得绕过protected访问成为可能,而没有任何明确的转换,也就是无意中…

干杯&hth。,

当你有一个正常的指针(一个对象或一个基本types),你可以使用*来解引用它:

 int a; int* b = a; *b = 5; // we use *b to dereference b, to access the thing it points to 

从概念上讲,我们使用成员函数指针来做同样的事情:

 class SomeClass { public: void func() {} }; // typedefs make function pointers much easier. // this is a pointer to a member function of SomeClass, which takes no parameters and returns void typedef void (SomeClass::*memfunc)(); memfunc myPointer = &SomeClass::func; SomeClass foo; // to call func(), we could do: foo.func(); // to call func() using our pointer, we need to dereference the pointer: foo.*myPointer(); // this is conceptually just: foo . *myPointer (); // likewise with a pointer to the object itself: SomeClass* p = new SomeClass; // normal call func() p->func(); // calling func() by dereferencing our pointer: p->*myPointer(); // this is conceptually just: p -> *myPointer (); 

我希望能帮助解释这个概念。 我们正在有效地解除指向成员函数的指针。 比这更复杂一些 – 它不是一个内存函数的绝对指针,而只是一个偏移量,它应用于上面的foop 。 但从概念上讲,我们正在取消引用它,就像我们将引用一个普通的对象指针一样。

你不能像正常指针那样将指针指向成员,因为成员函数需要this指针,而且你必须以某种方式传递它。 所以,你需要使用这两个操作符,一边是对象,另一边是指针,例如(object.*ptr)()

尽pipe如此,考虑使用functionbindstd::boost:: ,取决于您是否编写C ++ 03或0x)而不是这些。

Interesting Posts