青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 3,  comments - 6,  trackbacks - 0

今天看《C++ Primer》的成員訪問操作符。看重載箭頭操作符部分,剛開始有點迷茫,看了兩遍總算有點理解,把心得寫在這,與各位分享,如果有錯誤歡迎指正。
箭頭操作符(->)的通常用法是,使用一個類對象的指針來調用該指針所指對象的成員。左操作數為對象指針,右操作數為該對象的成員。定義重載箭頭操作符之后看起來就有點特別,可以用類對象的指針來調用,也可以用類對象直接調用。
重載箭頭操作符,首先重載箭頭操作符必須定義為類成員函數。
箭頭操作符可能看起來是二元操作符:接受一個對象和一個成員名,對對象解引用以獲取成員。其實箭頭操作符是一元操作符,沒有顯示形參(而且是類成員,唯一隱式形參是this)。->的右操作數不是表達式,而是對應類成員的一個標識符,由編譯器處理獲取成員工作(編譯器對重載箭頭操作符所做的事情,比其它重載操作符要多,這里也正是復雜的地方)。
下面這一段是《C++ Primer》重載箭頭操作符的內容。

----------------------------------------華麗分割線----------------------------------------
重載箭頭操作符
箭頭操作符與眾不同。它可能表現得像二元操作符一樣:接受一個對象和一個成員名。對對象解引用以獲取成員。不管外表如何,箭頭操作符不接受顯式形參。
這里沒有第二個形參,因為 -> 的右操作數不是表達式,相反,是對應著類成員的一個標識符。沒有明顯可行的途徑將一個標識符作為形參傳遞給函數,相反,由編譯器處理獲取成員的工作。

當這樣編寫時:
     point->action();

由于優先級規則,它實際等價于編寫:
     (point->action)();
換句話說,我們想要調用的是對 point->action 求值的結果。編譯器這樣對該代碼進行求值:

1.如果 point 是一個指針,指向具有名為 action 的成員的類對象,則編譯器將代碼編譯為調用該對象的 action 成員。

2.否則,如果 point(注:中文版誤寫為action) 是定義了 operator-> 操作符的類的一個對象,則 point->action 與 point.operator->()->action 相同。即,執行 point 的 operator->(),然后使用該結果重復這三步。

3.否則,代碼出錯。

對重載箭頭的返回值的約束
重載箭頭操作符必須返回指向類類型的指針,或者返回定義了自己的箭頭操作符的類類型對象。

如果返回類型是指針,則內置箭頭操作符可用于該指針,編譯器對該指針解引用并從結果對象獲取指定成員。如果被指向的類型沒有定義那個成員,則編譯器產生一個錯誤。
如果返回類型是類類型的其他對象(或是這種對象的引用),則將遞歸應用該操作符。編譯器檢查返回對象所屬類型是否具有成員箭頭,如果有,就應用那個操作符;否則,編譯器產生一個錯誤。這個過程繼續下去,直到返回一個指向帶有指定成員的的對象的指針,或者返回某些其他值,在后一種情況下,代碼出錯。
----------------------------------------華麗分割線----------------------------------------
如果上面分割線之間的內容看懂了,下面的也就不用看了哈。
根據理解,定義了3個類,C包含B,B包含A。A、B、C都定義了一個action的成員函數。B和C都重載箭頭操作符,不同的是B的重載箭頭操作符返回的是A類對象的指針,而C的重載箭頭操作符返回的是B類對象。

#include <iostream>   
using namespace std;   
  
class A{   
public:   
    
void action(){   
        cout 
<< "Action in class A!" << endl;   
    }
   
}
;   
  
class B{   
    A a;   
public:   
    A
* operator->(){   
        
return &a;   
    }
   
    
void action(){   
        cout 
<< "Action in class B!" << endl;   
    }
   
}
;   
  
class C{   
    B b;   
public:   
    B 
operator->(){   
        
return b;   
    }
   
    
void action(){   
        cout 
<< "Action in class C!" << endl;   
    }
   
}
;   
  
int main(int argc, char *argv[])   
{   
    C
* pc = new C;   
    pc
->action();   
    C c;   
    c
->action();    
    getchar();   
    
return 0;   
}
  
#include 
<iostream>
using namespace std;

class A{
public:
 
void action(){
  cout 
<< "Action in class A!" << endl;
 }

}
;

class B{
 A a;
public:
 A
* operator->(){
  
return &a;
 }

 
void action(){
  cout 
<< "Action in class B!" << endl;
 }

}
;

class C{
 B b;
public:
 B 
operator->(){
  
return b;
 }

 
void action(){
  cout 
<< "Action in class C!" << endl;
 }

}
;

int main(int argc, char *argv[])
{
 C
* pc = new C;
 pc
->action();
 C c;
 c
->action(); 
 getchar();
 
return 0;
}
 


上面代碼輸出結果是:
Action in class C!
Action in class A!

其中的代碼
C* pc = new C;
pc->action();
輸出的結果是
Action in class C!
這個結果比較好理解,pc是類對象指針,此時的箭頭操作符使用的是內置含義,對pc解引用然后調用對象的成員函數action。

而下面的代碼
C c;
c->action();

輸出的結果是
Action in class A!
其實c->action();的含義與c.operator->().operator->()->action();相同。

c是對象,c后面的箭頭操作符使用的是重載箭頭操作符,即調用類C的operator->()成員函數。此時返回的是類B的對象,所以調用類B的operator->()成員函數,B的operator->()返回的是指針,所以現在可以使用內置箭頭操作符了。對B的operator->()返回的指針進行解引用,然后調用解引用后的對象的成員函數action,此時調用的就是類A的action()。這里存在一個遞歸調用operator->()的過程,最后再使用一次內置含義的箭頭操作符。

posted on 2010-08-15 13:20 custa 閱讀(2361) 評論(3)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国产精品人| 久久爱另类一区二区小说| 欧美久久在线| 蜜桃av一区二区三区| 久久久国际精品| 久久在线免费观看视频| 免费观看一级特黄欧美大片| 免费不卡中文字幕视频| 欧美激情一区二区三区| 欧美日韩在线第一页| 国产欧美丝祙| 亚洲国产精品电影| 99精品国产高清一区二区| 亚洲一区二区黄| 久久精品一区二区三区不卡牛牛| 久久婷婷激情| 亚洲国产午夜| 日韩视频不卡| 久久精品视频va| 欧美三级不卡| 一区二区三区无毛| 亚洲综合成人婷婷小说| 老司机成人网| 亚洲视频综合| 免费在线播放第一区高清av| 国产精品久久久久久久免费软件| 国产香蕉97碰碰久久人人| 亚洲人屁股眼子交8| 欧美亚洲一级片| 亚洲国产精品999| 午夜精品三级视频福利| 欧美国产先锋| 在线观看中文字幕亚洲| 午夜精品久久久久久99热| 欧美激情一区二区| 久久本道综合色狠狠五月| 欧美日韩精品一区| 亚洲区国产区| 欧美不卡一区| 欧美中文字幕久久| 国产精品婷婷| 亚洲女爱视频在线| 亚洲精品社区| 欧美激情亚洲综合一区| 黄色工厂这里只有精品| 亚洲欧美日韩一区二区| 国产一区二区精品久久99| 亚洲精品国久久99热| 久久综合狠狠| 亚洲特级毛片| 欧美色视频日本高清在线观看| 尤妮丝一区二区裸体视频| 午夜精品久久久久久久久久久| 亚洲欧洲中文日韩久久av乱码| 久久精品人人做人人综合| 国产日本欧洲亚洲| 午夜精品免费| 亚洲欧美电影在线观看| 欧美午夜精品久久久久久孕妇| 亚洲理伦在线| 亚洲精品午夜| 欧美日韩国内自拍| 亚洲视频在线免费观看| 91久久精品国产91性色| 久久久噜噜噜久久| 伊人激情综合| 欧美电影在线| 欧美成人嫩草网站| 亚洲免费精彩视频| 亚洲日本精品国产第一区| 欧美福利电影在线观看| 亚洲精品在线免费观看视频| 亚洲高清网站| 欧美日韩国产限制| 亚洲欧美日韩系列| 欧美在线电影| 亚洲国产91| 日韩网站在线观看| 久久久久久久久岛国免费| 午夜精品国产更新| 国外精品视频| 亚洲国产精品久久久久婷婷884 | 欧美精品系列| 一本色道久久88综合日韩精品| 亚洲精品一区二区三区99| 欧美午夜精品理论片a级大开眼界| 亚洲女同性videos| 久久精品日韩欧美| 亚洲美女毛片| 亚洲伊人一本大道中文字幕| 韩国视频理论视频久久| 亚洲国产精品久久久久婷婷老年 | 亚洲天堂成人在线视频| 国产日韩精品视频一区| 欧美大片va欧美在线播放| 欧美另类综合| 在线电影国产精品| 夜夜嗨一区二区| 亚洲免费中文字幕| 亚洲激情偷拍| 亚洲专区一区二区三区| 亚洲成在线观看| 99在线热播精品免费| 国产真实精品久久二三区| 亚洲欧洲一区二区在线播放| 国产亚洲精品v| 亚洲另类在线视频| 国产欧美一区二区三区在线老狼| 欧美电影在线观看| 国产精品免费福利| 91久久精品国产91性色tv| 韩日成人在线| 亚洲视频在线观看网站| 亚洲日韩中文字幕在线播放| 欧美在线日韩精品| 亚洲欧美日韩人成在线播放| 欧美金8天国| 免费成人黄色av| 国产亚洲免费的视频看| 一区二区欧美亚洲| 99精品国产在热久久下载| 性欧美8khd高清极品| 一区二区三区视频观看| 免费h精品视频在线播放| 久久久国产一区二区三区| 国产精品国产a级| 亚洲精选中文字幕| 亚洲国产日韩欧美在线图片| 久久成人精品| 久久久精品一区| 国产九九精品| 亚洲深夜福利| 亚洲久久在线| 欧美aaa级| 亚洲高清资源| 亚洲另类自拍| 欧美日韩成人网| 日韩亚洲成人av在线| 一区二区三区国产盗摄| 欧美日韩国产一区二区三区地区| 欧美国产日韩一区二区在线观看| 在线成人免费观看| 欧美aa在线视频| 亚洲电影网站| 亚洲精品欧美极品| 欧美成人久久| 亚洲精品一区二区三区四区高清 | 欧美色欧美亚洲另类七区| 欧美激情视频网站| 亚洲乱码国产乱码精品精可以看| 欧美黑人在线播放| 亚洲国产视频直播| 99国产精品视频免费观看一公开| 欧美激情综合五月色丁香| 亚洲精品视频免费在线观看| 在线视频欧美日韩| 国产精品一区久久久| 久久精品三级| 亚洲免费观看高清完整版在线观看熊 | 亚洲精品在线二区| 久久久久久久91| 欧美亚洲系列| 国产精品自在在线| 久久久青草婷婷精品综合日韩 | 欧美一区二区三区的| 在线视频精品一区| 国产精品欧美一区喷水| 久久久一二三| 欧美黄色一区| 欧美一区二区三区婷婷月色| 欧美在线亚洲一区| 夜夜躁日日躁狠狠久久88av| 午夜免费久久久久| 精品成人国产| 制服诱惑一区二区| 日韩一区二区福利| 久久久久久97三级| 亚洲欧美电影院| 欧美激情影音先锋| 麻豆成人在线| 国产丝袜一区二区三区| 夜夜精品视频一区二区| 精品999在线观看| 欧美一区二区日韩一区二区| 亚洲人成7777| 欧美成年人视频| 欧美高清在线视频| 在线电影国产精品| 久久精品国产综合精品| 亚洲男人av电影| 欧美亚男人的天堂| 亚洲午夜女主播在线直播| 亚洲一区二区久久| 欧美日韩综合视频网址| av成人动漫| 午夜精品婷婷| 国产亚洲永久域名| 欧美jizz19性欧美| 国内精品久久久久影院优| 久久精品国产免费看久久精品 |