2010-03-30 53 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