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

posts - 3,  comments - 6,  trackbacks - 0

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

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

當(dāng)這樣編寫時(shí):
     point->action();

由于優(yōu)先級(jí)規(guī)則,它實(shí)際等價(jià)于編寫:
     (point->action)();
換句話說(shuō),我們想要調(diào)用的是對(duì) point->action 求值的結(jié)果。編譯器這樣對(duì)該代碼進(jìn)行求值:

1.如果 point 是一個(gè)指針,指向具有名為 action 的成員的類對(duì)象,則編譯器將代碼編譯為調(diào)用該對(duì)象的 action 成員。

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

3.否則,代碼出錯(cuò)。

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

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

#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;
}
 


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

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

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

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

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

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

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   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>
            欧美一区观看| 欧美激情精品久久久久久蜜臀| 亚洲女性喷水在线观看一区| 韩日欧美一区二区三区| 欧美高清免费| 午夜在线视频观看日韩17c| 亚洲精华国产欧美| 国产乱码精品一区二区三区忘忧草 | 麻豆freexxxx性91精品| av不卡在线| 久久免费国产精品1| 亚洲网站啪啪| 亚洲欧洲日产国码二区| 国产精品自在线| 国产精品网站在线| 国产精品v欧美精品∨日韩| 欧美区在线观看| 国产免费亚洲高清| 欧美日韩亚洲国产精品| 欧美日韩国产色站一区二区三区| 农夫在线精品视频免费观看| 久久久噜噜噜久久| 极品中文字幕一区| 美女国内精品自产拍在线播放| 美国十次了思思久久精品导航| 欧美黄免费看| 欧美国产日本在线| 亚洲一区bb| 欧美激情小视频| 国产一区二区成人久久免费影院| 亚洲人成网站在线观看播放| 亚洲嫩草精品久久| 欧美激情精品久久久久久免费印度| 亚洲午夜电影网| 欧美日韩亚洲一区三区| 亚洲黄色影院| 老司机午夜免费精品视频| 一本色道精品久久一区二区三区 | 亚洲精品在线二区| 蜜桃久久精品一区二区| 国产亚洲制服色| 久久久久久久网站| 久久久蜜桃一区二区人| 国产一区二区三区观看 | 国产午夜精品久久久| 一本一本久久| 中文亚洲视频在线| 国产精品第一区| 午夜一区二区三区不卡视频| 中文高清一区| 韩日成人在线| 欧美88av| 亚洲一区精品视频| 99re66热这里只有精品4| 美日韩精品免费| 欧美激情片在线观看| 国产日韩精品久久| 一区二区欧美视频| 性色av一区二区三区红粉影视| 欧美日韩精品在线视频| 亚洲国产成人午夜在线一区| 国外成人在线视频| 亚洲成在人线av| 亚洲无亚洲人成网站77777| 亚洲作爱视频| 亚洲精品免费一区二区三区| 亚洲欧美国产毛片在线| 日韩午夜免费| 久久综合999| 亚洲欧美日韩成人| 国产精品不卡在线| 蜜桃久久av| 亚洲人成毛片在线播放| 久久精品国产清自在天天线| 午夜亚洲福利在线老司机| 欧美日韩一区二区三区在线看| 欧美黄在线观看| 亚洲国产va精品久久久不卡综合| 亚洲欧美亚洲| 欧美在线视频一区二区| 国产精品视频999| 欧美伊人久久大香线蕉综合69| 亚洲女人天堂成人av在线| 欧美日韩亚洲综合在线| 亚洲在线一区二区| 久久久久久9999| 亚洲欧洲一区二区三区久久| 欧美精品国产一区| 欧美电影免费观看大全| 欧美1级日本1级| 欧美激情中文字幕一区二区| 欧美亚洲网站| 在线综合+亚洲+欧美中文字幕| 欧美系列一区| 久久精品91久久久久久再现| 99精品国产热久久91蜜凸| 久久精品亚洲| 亚洲激情成人网| 亚洲黄色在线看| 欧美日韩精品中文字幕| 久久国产福利国产秒拍| 欧美xxx成人| 欧美国产日韩精品| 欧美精品一区二区三区蜜桃| 久久伊人免费视频| 亚洲伦理久久| 欧美成人一区二区三区| 中文久久乱码一区二区| 国内精品久久久久国产盗摄免费观看完整版| 久久久久久久综合日本| 性欧美暴力猛交另类hd| 亚洲精选中文字幕| 亚洲高清在线观看| 欧美11—12娇小xxxx| 久久久综合网| 久久国内精品视频| 欧美一区中文字幕| 久久aⅴ国产紧身牛仔裤| 午夜视频在线观看一区| 亚洲综合色在线| 欧美主播一区二区三区美女 久久精品人| 亚洲精品久久久一区二区三区| 韩日欧美一区| 在线欧美福利| 一个色综合导航| 香蕉尹人综合在线观看| 久久精品欧美日韩精品| 欧美综合国产精品久久丁香| 久久久精品免费视频| 欧美国产精品人人做人人爱| 免费在线观看日韩欧美| 嫩草影视亚洲| 亚洲伦伦在线| 亚洲欧美国产77777| 亚洲一二三区精品| 亚洲宅男天堂在线观看无病毒| 亚洲欧美日本日韩| 欧美成人精品在线| 一本一道久久综合狠狠老精东影业| 亚洲素人一区二区| 免费观看成人网| 国产精品日韩精品| 一级成人国产| 亚洲国产精品va在线看黑人| 亚洲综合社区| 国产精品久久精品日日| 亚洲欧洲精品一区二区精品久久久| 中日韩高清电影网| 欧美激情国产日韩| 久久人人97超碰精品888| 国产情人综合久久777777| 亚洲一区二区成人| 亚洲精品一区二区三区av| 免费不卡视频| 亚洲人成网站精品片在线观看 | 亚洲裸体视频| 欧美日韩一区二区视频在线观看| 亚洲国产综合91精品麻豆| 久久综合五月天婷婷伊人| 亚洲欧美变态国产另类| 国产欧美亚洲日本| 蜜桃久久av一区| 欧美国产丝袜视频| 一本久久综合亚洲鲁鲁| 亚洲图中文字幕| 黄色成人在线| 亚洲日本在线观看| 国产精品入口尤物| 欧美国产大片| 国产情侣一区| 亚洲第一综合天堂另类专| 欧美午夜女人视频在线| 久久福利电影| 欧美精品三级在线观看| 欧美在线国产精品| 欧美成人黑人xx视频免费观看 | 夜夜夜精品看看| 亚洲久久一区二区| 国产精品无人区| 亚洲欧美成人网| 欧美黄色视屏| 欧美在线91| 亚洲日本中文字幕| 国产日韩欧美在线观看| 欧美国产日韩在线| 亚洲一区二区在线观看视频| 久久综合给合| 亚洲欧美制服另类日韩| 亚洲黄色三级| 国产在线视频欧美| 欧美日本免费一区二区三区| 久久精品国产亚洲一区二区三区 | 久久夜精品va视频免费观看| 亚洲欧洲免费视频| 国产一区二区黄| 亚洲免费在线视频一区 二区| 久久精品91久久香蕉加勒比| 老司机免费视频一区二区| 亚洲女爱视频在线| 亚洲日本久久|