詳解C++中的成員訪問運算符和指針到成員運算符
成員訪問運算符:. 和 ->
語法
postfix-expression
. name
postfix-expression –> name
備注
成員訪問運算符 . 和 -> 用來引用結構、聯合和類的成員。成員訪問表達式具有選定成員的值和類型。
有兩種形式的成員訪問表達式:
在第一種形式中,postfix-expression 表示結構、類或聯合類型的值,name 為指定的結構、聯合或類的成員命名。運算的值是 name 的值且為左值(如果 postfix-expression 是左值)。
在第二種形式中,postfix-expression 表示指向結構、聯合或類的指針,name 為指定的結構、聯合或類的成員命名。該值是 name 的值且是左值。 –> 運算符取消引用該指針。因此,表達式 e–>member 和 (*e).member(其中,e 表示指針)會產生相同的結果(重載運算符 –> 或 * 的情況除外)。
以下示例演示成員訪問運算符的兩種形式。
// expre_Selection_Operator.cpp // compile with: /EHsc #include <iostream> using namespace std; struct Date { Date(int i, int j, int k) : day(i), month(j), year(k){} int month; int day; int year; }; int main() { Date mydate(1,1,1900); mydate.month = 2; cout << mydate.month << "/" << mydate.day << "/" << mydate.year << endl; Date *mydate2 = new Date(1,1,2000); mydate2->month = 2; cout << mydate2->month << "/" << mydate2->day << "/" << mydate2->year << endl; delete mydate2; }
這樣的話出來的兩個值分別為:
2/1/1900 2/1/2000
指針到成員運算符:.* 和 ->*
語法
expression .* expression
expression –>* expression
備注
指向成員的指針運算符(.* 和 –>*)返回表達式左側上指定的對象的特定類成員的值。右側必須指定該類的成員。下面的示例演示如何使用這些運算符:
// expre_Expressions_with_Pointer_Member_Operators.cpp // compile with: /EHsc #include <iostream> using namespace std; class Testpm { public: void m_func1() { cout << "m_func1\n"; } int m_num; }; // Define derived types pmfn and pmd. // These types are pointers to members m_func1() and // m_num, respectively. void (Testpm::*pmfn)() = &Testpm::m_func1; int Testpm::*pmd = &Testpm::m_num; int main() { Testpm ATestpm; Testpm *pTestpm = new Testpm; // Access the member function (ATestpm.*pmfn)(); (pTestpm->*pmfn)(); // Parentheses required since * binds // less tightly than the function call. // Access the member data ATestpm.*pmd = 1; pTestpm->*pmd = 2; cout << ATestpm.*pmd << endl << pTestpm->*pmd << endl; delete pTestpm; } Output m_func1 m_func1
結果分別為:
1 2
在前面的示例中,指向成員的指針 pmfn 用于調用成員函數 m_func1。另一個指向成員的指針 pmd 用于訪問 m_num 成員。
二元運算符 .* 將其第一操作數(必須是類類型的對象)與其第二操作數(必須是指向成員的指針類型)組合在一起。
二元運算符 –>* 將其第一操作數(必須是指向類類型的對象的指針)與其第二操作數(必須是指向成員的指針類型)組合在一起。
在包含 .* 運算符的表達式中,第一操作數必須是類類型且可訪問,而指向第二操作數中指定的成員的指針或可訪問類型的成員的指針明確從該類派生并且可供該類訪問。
在包含 –>* 運算符的表達方式中,第一操作數必須是第二操作數中指定的類型的“指向類類型的指針”或明確地從該類派生的類型。
考慮以下類和程序段:
// expre_Expressions_with_Pointer_Member_Operators2.cpp // C2440 expected class BaseClass { public: BaseClass(); // Base class constructor. void Func1(); }; // Declare a pointer to member function Func1. void (BaseClass::*pmfnFunc1)() = &BaseClass::Func1; class Derived : public BaseClass { public: Derived(); // Derived class constructor. void Func2(); }; // Declare a pointer to member function Func2. void (Derived::*pmfnFunc2)() = &Derived::Func2; int main() { BaseClass ABase; Derived ADerived; (ABase.*pmfnFunc1)(); // OK: defined for BaseClass. (ABase.*pmfnFunc2)(); // Error: cannot use base class to // access pointers to members of // derived classes. (ADerived.*pmfnFunc1)(); // OK: Derived is unambiguously // derived from BaseClass. (ADerived.*pmfnFunc2)(); // OK: defined for Derived. }
指向成員的指針運算符 .* 或 –>* 的結果是在指向成員的指針的聲明中指定的類型的對象或函數。因此,在前面的示例中,表達式 ADerived.*pmfnFunc1() 的結果是指向返回 void 的函數的指針。如果第二操作數是左值,則此結果為左值。
System_CAPS_note注意
如果某個指向成員的指針運算符的結果是函數,則該結果只能用作函數調用運算符的操作數。
相關文章
淺析c#中如何在form的webbrowser控件中獲得鼠標坐標
以下是對c#中如何在form的webbrowser控件中獲得鼠標坐標的實現方法進行了詳細的分析介紹,需要的朋友可以參考下2013-07-07