詳解C++中的成員訪問運(yùn)算符和指針到成員運(yùn)算符
成員訪問運(yùn)算符:. 和 ->
語法
postfix-expression
. name
postfix-expression –> name
備注
成員訪問運(yùn)算符 . 和 -> 用來引用結(jié)構(gòu)、聯(lián)合和類的成員。成員訪問表達(dá)式具有選定成員的值和類型。
有兩種形式的成員訪問表達(dá)式:
在第一種形式中,postfix-expression 表示結(jié)構(gòu)、類或聯(lián)合類型的值,name 為指定的結(jié)構(gòu)、聯(lián)合或類的成員命名。運(yùn)算的值是 name 的值且為左值(如果 postfix-expression 是左值)。
在第二種形式中,postfix-expression 表示指向結(jié)構(gòu)、聯(lián)合或類的指針,name 為指定的結(jié)構(gòu)、聯(lián)合或類的成員命名。該值是 name 的值且是左值。 –> 運(yùn)算符取消引用該指針。因此,表達(dá)式 e–>member 和 (*e).member(其中,e 表示指針)會(huì)產(chǎn)生相同的結(jié)果(重載運(yùn)算符 –> 或 * 的情況除外)。
以下示例演示成員訪問運(yùn)算符的兩種形式。
// 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; }
這樣的話出來的兩個(gè)值分別為:
2/1/1900 2/1/2000
指針到成員運(yùn)算符:.* 和 ->*
語法
expression .* expression
expression –>* expression
備注
指向成員的指針運(yùn)算符(.* 和 –>*)返回表達(dá)式左側(cè)上指定的對象的特定類成員的值。右側(cè)必須指定該類的成員。下面的示例演示如何使用這些運(yùn)算符:
// 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
結(jié)果分別為:
1 2
在前面的示例中,指向成員的指針 pmfn 用于調(diào)用成員函數(shù) m_func1。另一個(gè)指向成員的指針 pmd 用于訪問 m_num 成員。
二元運(yùn)算符 .* 將其第一操作數(shù)(必須是類類型的對象)與其第二操作數(shù)(必須是指向成員的指針類型)組合在一起。
二元運(yùn)算符 –>* 將其第一操作數(shù)(必須是指向類類型的對象的指針)與其第二操作數(shù)(必須是指向成員的指針類型)組合在一起。
在包含 .* 運(yùn)算符的表達(dá)式中,第一操作數(shù)必須是類類型且可訪問,而指向第二操作數(shù)中指定的成員的指針或可訪問類型的成員的指針明確從該類派生并且可供該類訪問。
在包含 –>* 運(yùn)算符的表達(dá)方式中,第一操作數(shù)必須是第二操作數(shù)中指定的類型的“指向類類型的指針”或明確地從該類派生的類型。
考慮以下類和程序段:
// 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. }
指向成員的指針運(yùn)算符 .* 或 –>* 的結(jié)果是在指向成員的指針的聲明中指定的類型的對象或函數(shù)。因此,在前面的示例中,表達(dá)式 ADerived.*pmfnFunc1() 的結(jié)果是指向返回 void 的函數(shù)的指針。如果第二操作數(shù)是左值,則此結(jié)果為左值。
System_CAPS_note注意
如果某個(gè)指向成員的指針運(yùn)算符的結(jié)果是函數(shù),則該結(jié)果只能用作函數(shù)調(diào)用運(yùn)算符的操作數(shù)。
上一篇:C++語言編寫寫日志類
欄 目:C語言
本文標(biāo)題:詳解C++中的成員訪問運(yùn)算符和指針到成員運(yùn)算符
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2599.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文