2010-03-30 239 views
20

是否存在,以及如果它有什么作用?C++中的星号运算符

.* 
+0

您能否将代码粘贴到您看到的地方? – 2010-03-30 20:45:01

回答

26

是的,有。它是指向成员类型的指针成员操作符。

E.g.

struct A 
{ 
    int a; 
    int b; 
}; 

int main() 
{ 
    A obj; 
    int A::* ptr_to_memb = &A::b; 

    obj.*ptr_to_memb = 5; 

    ptr_to_memb = &A::a; 

    obj.*ptr_to_memb = 7; 

    // Both members of obj are now assigned 
} 

这里,A是一个结构和ptr_to_memb是指向的Aint构件。 .*A实例与指向成员的指针结合起来,形成一个左值表达式,指向给定的A实例obj的相应成员。

指向成员的指针可以是指向数据成员或函数成员的指针,甚至可以为虚拟函数成员“做正确的事情”。

E.g.此程序输出f(d) = 1

struct Base 
{ 
    virtual int DoSomething() 
    { 
     return 0; 
    } 
}; 

int f(Base& b) 
{ 
    int (Base::*f)() = &Base::DoSomething; 
    return (b.*f)(); 
} 

struct Derived : Base 
{ 
    virtual int DoSomething() 
    { 
     return 1; 
    } 
}; 

#include <iostream> 
#include <ostream> 

int main() 
{ 
    Derived d; 
    std::cout << "f(d) = " << f(d) << '\n'; 
    return 0; 
} 
12

您可能会遇到操作使用成员指针时:

struct foo 
{ 
    void bar(void); 
}; 

typedef void (foo::*func_ptr)(void); 

func_ptr fptr = &foo::bar; 
foo f; 

(f.*fptr)(); // call 

而且相关的是->*操作:

func_ptr fptr = &foo::bar; 
foo f; 
foo* fp = &f; 

(fp->*fptr)(); // call 
+0

不仅是成员_function_指针。 – sbi 2010-03-30 20:49:48

+0

这不是一个组合 - 它确实是一个单一的运营商(根据标准的第2.12,5.5节)。 FWIW,' - > *'也是单个运算符(相同的参考)。 – 2010-03-30 20:50:18

+0

@sbi:你在说什么......? :) @Jerry:我的意思是实际符号的组合,而不是运算符的组合。我想这是令人困惑的。 – GManNickG 2010-03-30 20:51:13