亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c++從零開始(十)——何謂類.txt

?? 介紹一些有關c/c++的文章 例如:VC++6.0 下搭建 wxWidgets 開發環境 最強大的.NET語言之對象構造 最強大的.NET語言之內存與資源 最強大的.NET語言之裝箱 C++
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
C++從零開始(十)——何謂類 
 
 
文章錄入:7747.Net    責任編輯:7747.Net  更新時間:2008-11-19 22:32:03 9 
 【字體:小 大】
 
 
C++從零開始(十)——何謂類 
原始出處:網絡

160前篇說明了結構只不過是定義了內存布局而已,提到類型定義符前還可以書寫class,即類型的自定義類型(簡稱類),它和結構根本沒有區別(僅有一點小小的區別,下篇說明),而之所以還要提供一個class,實際是由于C++是從C擴展而成,其中的class是C++自己提出的一個很重要的概念,只是為了與C語言兼容而保留了struct這個關鍵字。不過通過前面括號中所說的小小區別也足以看出C++的設計者為結構和類定義的不同語義,下篇說明。
暫時可以先認為類較結構的長足進步就是多了成員函數這個概念(雖然結構也可以有成員函數),在了解成員函數之前,先來看一種語義需求。


操作與資源

程序主要是由操作和被操作的資源組成,操作的執行者就是CPU,這很正常,但有時候的確存在一些需要,需要表現是某個資源操作了另一個資源(暫時稱作操作者),比如游戲中,經常出現的就是要映射怪物攻擊了玩家。之所以需要操作者,一般是因為這個操作也需要修改操作者或利用操作者記錄的一些信息來完成操作,比如怪物的攻擊力來決定玩家被攻擊后的狀態。這種語義就表現為操作者具有某些功能。為了實現上面的語義,如原來所說進行映射,先映射怪物和玩家分別為結構,如下:
struct Monster { float Life; float Attack; float Defend; };
struct Player { float Life; float Attack; float Defend; };
上面的攻擊操作就可以映射為void MonsterAttackPlayer( Monster &mon, Player &pla );。注意這里期望通過函數名來表現操作者,但和前篇說的將過河方案起名為sln一樣,屬于一種本末倒置,因為這個語義應該由類型來表現,而不是函數名。為此,C++提供了成員函數的概念。


成員函數

與之前一樣,在類型定義符中書寫函數的聲明語句將定義出成員函數,如下:
struct ABC { long a; void AB( long ); };
上面就定義了一個映射元素——第一個變量ABC::a,類型為long ABC::;以及聲明了一個映射元素——第二個函數ABC::AB,類型為void ( ABC:: )( long )。類型修飾符ABC::在此修飾了函數ABC::AB,表示其為函數類型的偏移類型,即是一相對值。但由于是函數,意義和變量不同,即其依舊映射的是內存中的地址(代碼的地址),但由于是偏移類型,也就是相對的,即是不完整的,因此不能對它應用函數操作符,如:ABC::AB( 10 );。這里將錯誤,因為ABC::AB是相對的,其相對的東西不是如成員變量那樣是個內存地址,而是一個結構指針類型的參數,參數名一定為this,這是強行定義的,后面說明。
注意由于其名字為ABC::AB,而上面僅僅是對其進行了聲明,要定義它,仍和之前的函數定義一樣,如下:
void ABC::AB( long d ) { this->a = d; }
應注意上面函數的名字為ABC::AB,但和前篇說的成員變量一樣,不能直接書寫long ABC::a;,也就不能直接如上書寫函數的定義語句(至少函數名為ABC::AB就不符合標識符規則),而必須要通過類型定義符“{}”先定義自定義類型,然后再書寫,這會在后面說明聲明時詳細闡述。
注意上面使用了this這個關鍵字,其類型為ABC*,由編譯器自動生成,即上面的函數定義實際等同于void ABC::AB( ABC *this, long d ) { this->a = d; }。而之所以要省略this參數的聲明而由編譯器來代勞是為了在代碼上體現出前面提到的語義(即成員的意義),這也是為什么稱ABC::AB是函數類型的偏移類型,它是相對于這個this參數而言的,如何相對,如下:
ABC a, b, c; a.ABC::AB( 10 ); b.ABC::AB( 12 ); c.AB( 14 );
上面利用成員操作符調用ABC::AB,注意執行后,a.a、b.a和c.a的值分別為10、12和14,即三次調用ABC::AB,但通過成員操作符而導致三次的this參數的值并不相同,并進而得以修改三個ABC變量的成員變量a。注意上面書寫a.ABC::AB( 10 );,和成員變量一樣,由于左右類型必須對應,因此也可a.AB( 10 );。還應注意上面在定義ABC::AB時,在函數體內書寫this->a = d;,同上,由于類型必須對應的關系,即this必須是相應自定義類型的指針,所以也可省略this->的書寫,進而有void ABC::AB( long d ) { a = d; }。
注意這里成員操作符的作用,其不再如成員變量時返回相應成員變量類型的數字,而是返回一函數類型的數字,但不同的就是這個函數類型是無法用語法表示出來的,即C++并沒有提供任何關鍵字或類型修飾符來表現這個返回的類型(VC內部提供了__thiscall這個類型修飾符進行表示,不過寫代碼時依舊不能使用,只是編譯器內部使用)。也就是說,當成員操作符右側接的是函數類型的偏移類型的數字時,返回一個函數類型的數字(表示其可被施以函數操作符),函數的類型為偏移類型中給出的類型,但這個類型無法表現。即a.AB將返回一個數字,這個數字是函數類型,在VC內部其類型為void ( __thiscall ABC:: )( long ),但這個類型在C++中是非法的。
C++并沒有提供類似__thiscall這樣的關鍵字以修飾類型,因為這個類型是要求編譯器遇到函數操作符和成員操作符時,如a.AB( 10 );,要將成員操作符左側的地址作為函數調用的第一個參數傳進去,然后再傳函數操作符中給出的其余各參數。即這個類型是針對同時出現函數操作符和成員操作符這一特定情況,給編譯器提供一些信息以生成正確的代碼,而不用于修飾數字(修飾數字就要求能應付所有情況)。即類型是用于修飾數字的,而這個類型不能修飾數字,因此C++并未提供類似__thiscall的關鍵字。
和之前一樣,由于ABC::AB映射的是一個地址,而不是一個偏移值,因此可以ABC::AB;但不能ABC::a;,因為后者是偏移值。根據類型匹配,很容易就知道也可有:
void ( ABC::*p )( long ) = ABC::AB;或void ( ABC::*p )( long ) = &ABC::AB;
進而就有:void ( ABC::**pP )( long ) = &p; ( c.**pP )( 10.0f );。之所以加括號是因為函數操作符的優先級較“*”高。再回想前篇說過指針類型的轉換只是類型變化,數值不變(下篇說明數值變化的情況),因此可以有如下代碼,這段代碼毫無意義,在此僅為加深對成員函數的理解。
struct ABC { long a; void AB( long ); };
void ABC::AB( long d )
{
this->a = d;
}
struct AB
{
short a, b;
void ABCD( short tem1, short tem2 );
void ABC( long tem );
};
void AB::ABCD( short tem1, short tem2 )
{
a = tem1; b = tem2;
}
void AB::ABC( long tem )
{
a = short( tem / 10 );
b = short( tem - tem / 10 );
}
void main()
{
ABC a, b, c; AB d;
( c.*( void ( ABC::* )( long ) )&AB::ABC )( 43 );
( b.*( void ( ABC::* )( long ) )&AB::ABCD )( 0XABCDEF12 );
( d.*( void ( AB::* )( short, short ) )ABC::AB )( 0XABCD, 0XEF12 );
}
上面執行后,c.a為0X00270004,b.a為0X0000EF12,d.a為0XABCD,d.b為0XFFFF。對于c的函數調用,由于AB::ABC映射的地址被直接轉換類型進而直接被使用,因此程序將跳到AB::ABC處的a = short( tem / 10 );開始執行,而參數tem映射的是傳遞參數的內存的首地址,并進而用long類型解釋而得到tem為43,然后執行。注意b = short( tem - tem / 10 );實際是this->b = short( tem - tem / 10 );,而this的值為c對應的地址,但在這里被認為是AB*類型(因為在函數AB::ABC的函數體內),所以才能this->b正常(ABC結構中沒有b這個成員變量),而b的偏移為2,所以上句執行完后將結果39存放到c的地址加2所對應的內存,并且以short類型解釋而得到的16位的二進制數存放。對于a = short( tem / 10 );也做同樣事情,故最后得c.a的值為0X0027004(十進制39轉成十六進制為0X27)。
同樣,對于b的調用,程序將跳到AB::ABCD,但生成的b的調用代碼時,將參數0XABCDEF12按照參數類型為long的格式記錄在傳遞參數的內存中,然后跳到AB::ABCD。但編譯AB::ABCD時又按照參數為兩個short類型來映射參數tem1和tem2對應的地址,因此容易想到tem1的值將為0XEF12,tem2的值為0XABCD,但實際并非如此。參數如何傳遞由之前說的函數調用規則決定,函數調用的具體實現細節在《C++從零開始(十五)》中說明,這里只需了解到成員函數映射的仍然是地址,而它的類型決定了如何使用它,后面說明。


聲明的含義

前面已經解釋過聲明是什么意思,在此由于成員函數的定義規則這種新的定義語法,必須重新考慮聲明的意思。注意一點,前面將一個函數的定義放到main函數定義的前面就可以不用再聲明那個函數了;同樣如果定義了某個變量,就不用再聲明那個變量了。這也就是說定義語句具有聲明的功能,但上面成員函數的定義語句卻不具有聲明的功能,下面來了解聲明的真正意思。
聲明是要求編譯器產生映射元素的語句。所謂的映射元素,就是前面介紹過的變量及函數,都只有3欄(或3個字段):類型欄、名字欄和地址欄(成員變量類型的這一欄就放偏移值)。即編譯器每當看到聲明語句,就生成一個映射元素,并且將對應的地址欄空著,然后留下一些信息以告訴連接器——此.obj文件(編譯器編譯源文件后生成的文件,對于VC是.obj文件)需要一些符號,將這些符號找到后再修改并完善此.obj文件,最后連接。
回想之前說過的符號的意思,它就是一字符串,用于編譯器和連接器之間的通信。注意符號沒有類型,因為連接器只是負責查找符號并完善(因為有些映射元素的地址欄還是空的)中間文件(對于VC就是.obj文件),不進行語法分析,也就沒有什么類型。
定義是要求編譯器填充前面聲明沒有書寫的地址欄。也就是說某變量對應的地址,只有在其定義時才知道。因此實際的在棧上分配內存等工作都是由變量的定義完成的,所以才有聲明的變量并不分配內存。但應注意一個重點,定義是生成映射元素需要的地址,因此定義也就說明了它生成的是哪個映射元素的地址,而如果此時編譯器的映射表(即之前說的編譯器內部用于記錄映射元素的變量表、函數表等)中沒有那個映射元素,即還沒有相應元素的聲明出現過,那么編譯器將報錯。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区免费看| 99国产精品久久久久久久久久| 欧美videos大乳护士334| 久久www免费人成看片高清| 欧美大片免费久久精品三p | 中文字幕亚洲成人| 色综合婷婷久久| 亚洲成人手机在线| 日韩欧美国产wwwww| 国产一区二区美女| 亚洲欧美日韩国产综合在线| 五月天亚洲婷婷| 欧美一区二区三区小说| 国产精品中文欧美| 亚洲丝袜精品丝袜在线| 欧美精品视频www在线观看| 美日韩一级片在线观看| 中文久久乱码一区二区| 在线视频亚洲一区| 蜜臀av国产精品久久久久| 国产欧美精品区一区二区三区| 99久久免费精品高清特色大片| 亚洲国产综合91精品麻豆| 日韩欧美一区二区在线视频| 国产成人夜色高潮福利影视| 亚洲美女免费在线| 欧美成人女星排行榜| gogogo免费视频观看亚洲一| 亚洲成人一区在线| 久久久久久久久久久久久女国产乱| 99久久久国产精品免费蜜臀| 婷婷成人综合网| 国产视频一区在线观看| 欧美色综合网站| 国产美女在线观看一区| 亚洲综合色网站| 久久蜜桃一区二区| 欧美性感一类影片在线播放| 韩国在线一区二区| 亚洲综合偷拍欧美一区色| 国产精品资源站在线| 亚洲午夜在线电影| 国产亚洲综合性久久久影院| 欧美亚洲丝袜传媒另类| 国产伦精一区二区三区| 亚洲国产精品嫩草影院| 久久精品视频免费| 在线观看91av| 色先锋aa成人| 国产精品自产自拍| 天天操天天干天天综合网| 国产精品久久国产精麻豆99网站| 欧美福利电影网| 色综合久久久久久久| 国产一区二区三区四区在线观看| 亚洲制服丝袜av| 中文字幕国产一区二区| 日韩欧美另类在线| 欧美在线你懂的| 成人18视频在线播放| 麻豆国产精品官网| 亚洲电影视频在线| 中文字幕一区二| 国产日韩欧美综合在线| 日韩一区二区免费在线观看| 91热门视频在线观看| 国产视频一区在线观看 | 日韩欧美黄色影院| 在线观看国产一区二区| 懂色av一区二区夜夜嗨| 免费看黄色91| 性做久久久久久| 一级特黄大欧美久久久| 国产精品欧美综合在线| 337p日本欧洲亚洲大胆色噜噜| 精品视频在线视频| 91浏览器入口在线观看| 福利91精品一区二区三区| 久久69国产一区二区蜜臀| 午夜视频久久久久久| 一区二区日韩电影| 中文字幕一区在线| 久久精品夜夜夜夜久久| 欧美xxxx老人做受| 日韩女同互慰一区二区| 69成人精品免费视频| 欧美性xxxxx极品少妇| 色婷婷综合久久久| 99久久精品国产观看| 成人高清免费在线播放| 国产成人av一区二区| 国产精品一区在线观看乱码| 麻豆精品国产91久久久久久 | 亚洲高清视频中文字幕| 欧美日韩国产经典色站一区二区三区| av中文字幕不卡| 岛国av在线一区| 国产91富婆露脸刺激对白| 国产高清一区日本| 国产成人精品影视| 国产成人精品一区二| 国产不卡在线播放| 国产91精品一区二区| 国产aⅴ综合色| 国产91在线看| 成人av在线播放网址| 成人黄色在线网站| 99九九99九九九视频精品| 99国产精品一区| 91国偷自产一区二区使用方法| 91黄色免费观看| 欧美亚洲一区三区| 这里是久久伊人| 欧美电影精品一区二区| 26uuu精品一区二区在线观看| 精品国产麻豆免费人成网站| 久久综合国产精品| 欧美激情自拍偷拍| 亚洲欧美视频在线观看| 一区二区三区精品久久久| 亚洲国产一区二区视频| 午夜激情一区二区| 久久免费精品国产久精品久久久久| 337p粉嫩大胆噜噜噜噜噜91av| 久久亚洲一区二区三区四区| 亚洲国产岛国毛片在线| 亚洲视频1区2区| 亚洲国产综合在线| 美腿丝袜亚洲色图| 国产精品1区二区.| 色综合天天综合网国产成人综合天 | 久久久久久电影| 日本一区二区免费在线 | 全部av―极品视觉盛宴亚洲| 麻豆精品视频在线观看视频| 国产一区二区三区国产| 成人avav在线| 欧美日韩一区二区欧美激情| 日韩一级高清毛片| 国产欧美日韩激情| 亚洲在线成人精品| 免费在线欧美视频| 成人免费视频国产在线观看| 色哟哟国产精品| 日韩欧美电影在线| 国产精品久久久久久久久动漫 | 色婷婷av一区二区三区软件 | 国产成都精品91一区二区三| 91在线视频18| 欧美精品18+| 久久精品亚洲乱码伦伦中文| 亚洲欧美成aⅴ人在线观看| 五月天一区二区| 福利一区二区在线观看| 欧美亚洲自拍偷拍| 2024国产精品| 一区二区三区国产豹纹内裤在线| 蜜臀91精品一区二区三区| 成人免费毛片嘿嘿连载视频| 欧美视频在线观看一区二区| 精品国产1区二区| 一区二区三区在线播放| 久久99蜜桃精品| 色婷婷久久99综合精品jk白丝| 日韩欧美精品在线视频| 中文字幕在线不卡| 免费成人你懂的| 色婷婷精品大在线视频 | 日韩欧美高清一区| 亚洲欧美日韩久久| 国模少妇一区二区三区| 在线一区二区三区四区五区| 欧美精品一区二区精品网| 亚洲精品视频在线| 国产一区在线观看视频| 欧美系列亚洲系列| 国产欧美一区二区三区鸳鸯浴 | 欧美日韩在线直播| 国产亚洲精品免费| 亚洲观看高清完整版在线观看| 高清不卡一二三区| 日韩一区二区三区电影在线观看| 综合精品久久久| 国产自产视频一区二区三区| 欧美专区亚洲专区| 欧美国产激情二区三区 | 波多野结衣视频一区| 日韩一级完整毛片| 夜夜嗨av一区二区三区网页 | 欧美亚洲国产一区二区三区va | 日韩精品在线一区| 亚洲国产精品久久艾草纯爱| 成人免费看片app下载| 日韩欧美久久久| 午夜精品一区二区三区电影天堂 | 99久久综合99久久综合网站| 精品一区二区在线播放| 欧美三级在线播放| 中文字幕一区二区三区不卡| 国产在线精品一区二区夜色|