精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++基礎之面向對象編程思想(二)

開發 后端
本文介紹的是以C++程序語言為基礎的面向對象的編程思想。希望對你有幫助,一起來看吧!

我們都知道,C++中最重要的概念——類,了解了類之后,已經可以開始做些編程方面比較高級的應用——設計程序,而不再只是將算法變成代碼。要說明如何設計程序,有必要先了解何謂面向對象編程思想。建議大家閱讀這一系列的文章,供大家參考。接上一篇>>

面向對象編程思想

前面已說明設計程序就是編寫程序欲解決的問題的描述,也就是編寫論調。而論調可以只用“名詞性概念”和“動詞性概念”表現出來,對象又正好是“名詞性概念”的實現,而利用前面說的沒有成員變量的類來映射“動詞性概念”就可以將其轉換為對象。因此,一個世界,可以完全由對象組成,而將算法所基于的世界只用對象表現出來,再進行后續代碼的編寫,這種編程方法就被稱作面向對象的編程思想。

注意,先設計算法應基于的世界,再全部用對象將其表述出來,然后再設計算法,最后映射為代碼。但前面在編寫商人過河問題時是直接給出算法的,并沒有設計世界啊?其實由于那個問題的過于簡單,我直接下意識地設計了世界,并且用前面所說的河岸論來描述它。應注意世界的設計完全依賴于問題,而準確地說,前面我并沒有設計世界,而是設計了河岸論來描述問題。

接著,由于對象就是實例,因此以對象來描述世界在C++中就是設計類,通過類的實例來組合表現世界。但應注意,面向對象是以對象來描述世界,但也描述算法,因為算法也會提出一些需要被映射的概念,如前面商人過河問題的算法中的過河方案。

但切記,當描述算法時操作了描述世界時定義的類,則一定要保持那個類的設計,不要因為算法中對那個類的實例的操作過于復雜而將那部分算法映射為這個類的一個成員函數,因為這嚴重遮蔽了算法的實現,破壞了程序的架構。如一個算法是讓汽車原地不停打轉,需要復雜的操作,那么難道給汽車加一個功能,讓它能原地不停地打轉?!這是在設計類的時候經常犯的錯誤,也由于這個原因,一個面向對象編寫的代碼并不是想象的只由類組成,其也可能由于將算法中的某些操作映射成函數而有大量的全局函數。

請記住:設計類時,如果是映射世界里的概念,不要考慮算法,只以這個世界為邊界來設計它,不要因為算法里的某個需要而給它加上錯誤的成員。

因此,將“名詞性概念”映射成類,“名詞性概念”的屬性和狀態映射為成員變量,“名詞性概念”的功能映射為成員函數。那么“動詞性概念”怎么辦?映射成沒有成員變量的類?前面也看見,由于過于別扭,實際中這種做法并不常見(STL中也只是將其作為一種技巧),故經常是將它映射為函數,雖然這有背于面向對象的思想,但要易于理解得多,進而程序的架構要簡明得多。

隨著面向對象編程思想的問世,一種全新的設計方式誕生了。由于它是如此的好以至于廣為流傳,但理解的錯誤導致錯誤的思想遍地而生,更糟糕的就是本末倒置,將這個設計方式稱作面向對象的編程思想,它的名字就是封裝。

封裝

先來看現在在各類VC教程中關于對象的講解中經常能看見的如下的一個類的設計。

 

 

  1. class Person  
  2. privatechar m_Name[20]; unsigned long m_Age; bool m_Sex;  
  3. public:  const char* GetName() const;  void SetName( const char* );  
  4. unsigned long GetAge() constvoid SetAge( unsigned long );  
  5. bool GetSex() const;  void SetSex( bool );  
  6.   }; 

 

上面將成員變量全部定義為private,然后又提供三對Get/Set函數來存取上面的三個成員變量(因為它們是private,外界不能直接存取),這三對函數都是public的,為什么要這樣?那些教材將此稱作封裝,是對類Person的內部內存布局的封裝,這樣外界就不知道其在內存上是如何布局的并進而可以保證內存的有效性(只由類自身操作其實例)。

首先要確認上面設計的荒謬性,它是正宗的“有門沒鎖”毫無意義。接著再看所謂的對內存布局的封裝。假設上面是在Person.h中的聲明,然后在b.cpp中要使用類Person,本來要#include "Person.h",現在替換成下面:

 

  1. class Person  
  2. publicchar m_Name[20]; unsigned long m_Age; bool m_Sex;  
  3. publicconst char* GetName() const;  void SetName( const char* );  
  4. unsigned long GetAge() constvoid SetAge( unsigned long );  
  5. bool GetSex() const;  void SetSex( bool );  
  6.   }; 

然后在b.cpp中照常使用類Person,如下:

 

  1. Person a, b; a.m_Age = 20; b.GetSex(); 

這里就直接使用了Person::m_Age了,就算不做這樣蹩腳的動作,依舊#include "Person.h",如下:

 

 

  1. struct PERSON { char m_Name[20]; unsigned long m_Age; bool m_Sex; };  
  2. Person a, b; PERSON *pP = ( PERSON* )&a; pP->m_Age = 40; 

 

上面依舊直接修改了Person的實例a的成員Person::m_Age,如何能隱藏內存布局?!請回想聲明的作用,類的內存布局是編譯器生成對象時必須的,根本不能對任何使用對象的代碼隱藏有關對象實現的任何東西,否則編譯器無法編譯相應的代碼。

那么從語義上來看。Person映射的不是真實世界中的人的概念,應該是存放某個數據庫中的某個記錄人員信息的表中的記錄的緩沖區,那么緩沖區應該具備那三對Get/Set所代表的功能嗎?緩沖區是緩沖數據用的,緩沖后被其它操作使用,就好像箱子,只是放東西用。

故上面的三對Get/Set沒有存在的必要,而三個成員變量則不能是 private。當然,如果Person映射的并不是緩沖區,而在其它的世界中具備像上面那樣表現的語義,則像上面那樣定義就沒有問題,但如果是因為對內存布局的封裝而那樣定義類則是大錯特錯的。

上面錯誤的根本在于沒有理解何謂封裝。為了說明封裝,先看下MFC(Microsoft Foundation Class Library——微軟功能類庫,一個定義了許多類的庫文件,其中的絕大部分類是封裝設計。關于庫文件在說明SDK時闡述)中的類CFile的定義。

從名字就可看出它映射的是操作系統中文件的概念,但它卻有這樣的成員函數——CFile::Open、CFile::Close、CFile::Read、 CFile::Write,有什么問題?這四個成員函數映射的都是對文件的操作而不是文件所具備的功能,分別為打開文件、關閉文件、從文件讀數據、向文件寫數據。這不是和前面說的成員函數的語義相背嗎?

上面四個操作有個共性,都是施加于文件這個資源上的操作,可以將它們叫做“被功能”,如文件具有“被打開”的功能,具有“被讀取”的功能,但應注意它們實際并不是文件的功能。

按照原來的說法,應該將文件映射為一個結構,如FILE,然后上面的四個操作應映射成四個函數,再利用名字空間的功能,如下:

 

 

  1. namespace OFILE  
  2. {  
  3. bool Open( FILE&, … );  bool Close( FILE&, … );  
  4. bool Read( FILE&, … );  bool Write( FILE&, … );  

 

上面的名字空間OFILE表示里面的四個函數都是對文件的操作,但四個函數都帶有一個FILE&的參數。回想非靜態成員函數都有個隱藏的參數this,因此,一個了不起的想法誕生了。

將所有對某種資源的操作的集合看成是一種資源,把它映射成一個類,則這個類的對象就是對某個對象的操作,此法被稱作封裝,而那個類被稱作包裝類或封裝類。

很明顯,包裝類映射的是“對某種資源的操作”,是一抽象概念,即包裝類的對象都是無狀態對象(指邏輯上應該是無狀態對象,但如果多個操作間有聯系,則還是可能有狀態的,但此時它的語義也相應地有些變化。如多一個CFile::Flush成員函數,用于刷新緩沖區內容,則此時就至少有一個狀態——緩沖區,還可有一個狀態記錄是否已經調用過CFile::Write,沒有則不用刷新)。

現在應能了解封裝的含義了。將對某種資源的操作封裝成一個類,此包裝類映射的不是世界中定義的某一“名詞性概念”,而是世界的“動詞性概念”或算法中“對某一概念的操作”這個人為定出來的抽象概念。由于包裝類是對某種資源的操作的封裝,則包裝類對象一定有個屬性指明被操作的對象,對于MFC中的 CFile,就是CFile::m_hFile成員變量(類型為HANDLE),其在包裝類對象的主要運作過程(前面的CFile::Read和 CFile::Write)中被讀。

有什么好處?封裝提供了一種手段以將世界中的部分“動詞性概念”轉換成對象,使得程序的架構更加簡單(多條“動詞性概念”變成一個“名詞性概念”,減少了“動詞性概念”的數量),更趨于面向對象的編程思想。

但應區別開包裝類對象和被包裝的對象。包裝類對象只是個外殼,而被包裝的對象一定是個具有狀態的對象,因為操作就是改變資源的狀態。對于 CFile,CFile的實例是包裝類對象,其保持著一個對被包裝對象——文件內核對象(Windows操作系統中定義的一種資源,用HANDLE的實例表征)——的引用,放在CFile::m_hFile中。

因此,包裝類對象是獨立于被包裝對象的。即CFile a;,此時a.m_hFile的值為0或-1,表示其引用的對象是無效的,因此如果a.Read( … );將失敗,因為操作施加的資源是無效的。

對此,就應先調用a.Open( … );以將a和一特定的文件內核對象綁定起來,而調用a.Close( … );將解除綁定。注意CFile::Close調用后只是解除了綁定,并不代表a已經被銷毀了,因為a映射的并不是文件內核對象,而是對文件內核對象操作的包裝類對象。

如果仔細想想,就會發現,老虎能夠吃兔子,兔子能夠被吃,那這里應該是老虎有個功能是“吃兔子”還是多個兔子的包裝類來封裝“吃兔子”的操作?

這其實不存在任何問題,“老虎吃兔子”和“兔子被吃”完全是兩個不同的操作,前者涉及兩種資源,后者只涉及一種資源,因此可以同時實現兩者,具體應視各自在相應世界中的語義。如果對于真實世界,則可以簡略地說老虎有個“吃”的功能,可以吃“肉”,而動物從“肉”和“自主能動性”多重繼承,兔子再從動物繼承。

這里有個類叫“自主能動性”,指動物具有意識,能夠自己動作,這在C++中的表現就是有成員函數的類,表示有功能可以被操作,但收音機也具有調臺等功能,難道說收音機也能自己動?!這就是世界的意義——運轉。

希望通過本文的介紹,能夠對你有幫助。

責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-14 17:24:10

C++面向對象思想

2011-08-04 11:04:14

Objective-C 面向對象 繼承

2023-04-26 00:15:32

python面向對象java

2010-01-20 09:48:44

面向對象

2010-08-24 16:00:43

C語言

2025-04-02 03:11:00

Python函數C++

2024-01-03 13:38:00

C++面向對象編程OOP

2010-01-19 15:36:02

C++語言

2020-04-15 11:07:31

C語言對象思想

2011-05-25 10:59:26

Javascript繼承

2011-05-13 10:51:25

javascript

2020-12-24 08:36:14

JavaJava基礎

2011-07-05 14:42:46

java

2009-06-22 13:48:00

Java編程思想面向對象

2009-11-23 19:24:01

PHP面向對象編程

2017-04-21 09:07:39

JavaScript對象編程

2012-01-17 09:34:52

JavaScript

2009-12-22 01:54:50

C++之父Bjarne Stro

2010-01-13 14:05:55

C++語言

2011-07-20 14:12:48

點贊
收藏

51CTO技術棧公眾號

无限资源日本好片| 2023国产精品| 依依成人精品视频| 亚洲第一福利在线观看| 日韩欧美三级电影| 国产精品suv一区二区| 免费在线成人激情电影| 国产成人av电影在线观看| 亚洲日本中文字幕| 国产真人做爰毛片视频直播| 一级做a爱片久久毛片| 亚洲三级网址| 天天影视涩香欲综合网| 成人免费视频网站| 91成人福利视频| 白嫩亚洲一区二区三区| 国产精品少妇自拍| 国产精品欧美日韩一区二区| 精品国产av无码| 欧美日韩在线观看首页| 成人a免费在线看| 久久99国产综合精品女同| 性欧美在线视频| 日本最黄一级片免费在线| 天堂网av成人| 欧美日韩久久久久| 九9re精品视频在线观看re6 | 福利视频网站一区二区三区| 国产999在线| 国产精品无码网站| 男人天堂视频在线观看| 国产精品久久久久久久久果冻传媒| 日韩美女免费线视频| 国产一二三区精品| 伊人久久大香线蕉av超碰| 亚洲精品欧美在线| www久久99| 日本污视频在线观看| 秋霞蜜臀av久久电影网免费| 天天影视色香欲综合网老头| 三级网在线观看| 亚洲av综合色区无码一二三区 | 成人亚洲一区二区一| 欧美夫妻性生活xx| 一本色道久久hezyo无码| 爱福利在线视频| 99r国产精品| 国产99在线|中文| 精品人妻在线播放| 亚洲成aⅴ人片久久青草影院| 91精品国产一区二区三区| 国产精品视频网站在线观看| 精品国产区在线| 国产精品久久久久一区| 欧美天堂视频| 日韩成人av电影在线| 在线免费看视频| 伊伊综合在线| 国产精品―色哟哟| 欧美日本亚洲| 国产精品伦一区二区三区| 欧美激情1区| 精品一区电影国产| 亚洲欧美在线精品| 福利一区二区| 亚洲成人动漫在线观看| 日韩久久不卡| porn视频在线观看| zzijzzij亚洲日本少妇熟睡| 国产精品扒开腿做爽爽爽男男| 少妇视频一区二区| 老司机aⅴ在线精品导航| 欧美日韩综合在线免费观看| 99热这里只有精品免费| 国产精品久久久久一区二区国产| 国产主播一区二区三区| 人体精品一二三区| 黄色一级视频在线观看| 精品一区二区三| 精品成人在线观看| 日本激情视频在线播放| 亚洲ww精品| 色视频欧美一区二区三区| 麻豆传媒网站在线观看| yw在线观看| 亚洲欧美综合网| 欧美一区二区三区精美影视 | 中文字幕无人区二| 91天天综合| 欧美一区二区三区小说| 午夜男人的天堂| 91成人福利社区| 日韩欧美国产综合一区| 永久免费的av网站| 电影一区二区三| 欧美性xxxxx极品少妇| 日本国产在线播放| 黄页在线观看免费| 色综合久久久久综合99| 日韩人妻无码精品久久久不卡| 五月天婷婷在线视频| 一区二区在线观看视频| 日韩人妻精品无码一区二区三区| 日韩伦理av| 亚洲视频免费观看| 中文字幕日韩一区二区三区| 国产天堂在线| 亚洲国产精品久久久男人的天堂 | 日本不卡一区| 欧美xxxbbb| 伊人色综合久久天天人手人婷| 成人在线观看你懂的| a成人v在线| 亚洲国产另类 国产精品国产免费| 又黄又爽又色的视频| 亚洲综合伊人| 日韩精品中文字| 青青操视频在线播放| 日韩精品亚洲专区| 国产精品久久中文| 亚洲经典一区二区| 国产精品久久久久影院色老大| 国自产拍偷拍精品啪啪一区二区| 亚洲精品乱码日韩| 亚洲欧洲日产国产网站| 久久9999久久免费精品国产| 欧美aaa在线| 成人精品久久一区二区三区| 国产精品久久久久久久免费| a亚洲天堂av| 欧美日韩激情四射| 亚洲午夜国产成人| 日韩中文字幕视频在线观看| 性爱在线免费视频| 久久婷婷激情| 国产精品香蕉国产| 国产乱色精品成人免费视频| 国产午夜精品一区二区三区视频 | 无码人妻久久一区二区三区蜜桃| 精品久久电影| 日韩av色在线| 视频国产在线观看| 久久久777精品电影网影网| 日韩资源av在线| 国产在线一在线二| 国产精品免费av| 成人免费毛片播放| 欧美黄页免费| 精品国产乱码久久久久久浪潮| 日本少妇aaa| 人人超碰91尤物精品国产| 91在线看www| 少妇又色又爽又黄的视频| 国产午夜精品一区二区三区四区| 人妻少妇被粗大爽9797pw| 欧美一级免费| 神马久久桃色视频| 久久精品国产亚洲av麻豆色欲| 国产精选一区二区三区| 免费不卡亚洲欧美| 成人免费看片| 色8久久人人97超碰香蕉987| 国产伦精品一区二区三区妓女| 一区二区三区四区五区精品视频 | 人妻激情另类乱人伦人妻| 久久国际精品| 亚洲美女在线视频| 色婷婷粉嫩av| 国产自产v一区二区三区c| 黄色www在线观看| 精品国产一区二区三区2021| 久久久伊人欧美| 亚洲特级黄色片| 99re在线视频这里只有精品| 六月丁香激情网| 国产精品美女久久久久| 日韩精品在线观看网站| 日韩免费av网站| 暴力调教一区二区三区| 97在线播放视频| 成人羞羞视频在线看网址| 97视频在线观看播放| 国产男女裸体做爰爽爽| 欧美国产欧美综合| 欧美成人免费高清视频| 精品成人自拍视频| 国产97在线播放| 激情影院在线观看| 欧美午夜寂寞影院| 印度午夜性春猛xxx交| 91伊人久久大香线蕉| 男人搞女人网站| 国产一区日韩| 人人澡人人澡人人看欧美| 天天在线视频色| 亚洲精品久久在线| 国产一国产二国产三| 91麻豆免费观看| 青青青免费在线| 欧美日韩精品在线一区| 91视频婷婷| 午夜小视频福利在线观看| 精品亚洲男同gayvideo网站| 国产又粗又猛又黄| 精品国产鲁一鲁一区二区张丽| 色婷婷国产精品免| 蜜桃在线一区二区三区| 国产精品国三级国产av| 亚洲伊人春色| 91九色在线观看| 忘忧草在线www成人影院| 亚洲欧美一区二区三区情侣bbw | 久草手机视频在线观看| 日本不卡在线视频| 丁香六月激情婷婷| 围产精品久久久久久久| 亚洲影院色无极综合| av网站免费在线观看| 日韩亚洲欧美中文三级| 欧美黑人精品一区二区不卡| 国产精品久线观看视频| 国产精品无码永久免费不卡| 国产精品一区在线观看乱码| 免费一级特黄录像| 亚洲一区网站| 91av在线国产| 中文字幕不卡av| 欧美另类极品videosbestfree| aaa在线视频| 午夜精品影院在线观看| 久久精品aⅴ无码中文字字幕重口| 日韩专区一卡二卡| www.99热这里只有精品| 欧美日韩爆操| 韩国成人av| 日韩视频一二区| 91sa在线看| 色a资源在线| 欧美多人爱爱视频网站| 高清全集视频免费在线| 日韩在线免费视频观看| 9色在线观看| 日韩一区二区在线观看视频播放| 亚洲一级黄色大片| 欧美羞羞免费网站| 国产精品久久久久久久久夜色| 国产精品福利一区| 国产精品久久免费观看| 国产午夜精品美女毛片视频| 性猛交ⅹxxx富婆video| 国产麻豆日韩欧美久久| 亚洲第一天堂久久| 国产乱子伦一区二区三区国色天香| 日韩一级免费片| 麻豆一区二区三| 久久这里只有精品23| 一区在线免费| 亚洲精品在线免费| 爱爱精品视频| 国产精品久久在线观看| 欧美videos粗暴| 成人激情在线播放| 九色精品蝌蚪| 国产精品视频一区二区三区经| 国产超碰精品| 国产精品啪视频| 国产成人久久精品一区二区三区| 亚洲japanese制服美女| 中文字幕久久精品一区二区| 国产一区二区三区色淫影院 | 精品免费视频| 无遮挡亚洲一区| 中文字幕一区二区三区欧美日韩 | 婷婷一区二区三区| 中文字幕视频网| 亚洲精品第1页| 日韩 国产 在线| 色一情一伦一子一伦一区| 怡红院男人天堂| 欧美日韩一区二区精品| 日韩精品一区二区亚洲av| 亚洲在线视频网站| 久草福利资源在线| 亚洲蜜桃精久久久久久久| 国产稀缺真实呦乱在线| 色老综合老女人久久久| 亚洲在线免费观看视频| 精品久久久久久久久久久久久久久 | 三级在线观看网站| 国产亚洲xxx| 三级视频在线| 精品国产亚洲在线| 日韩精品一二| 久久久久www| 免费网站成人| 中文字幕欧美精品在线| 1024在线播放| 国产成人涩涩涩视频在线观看 | 五月婷婷激情综合| 国内av在线播放| 色噜噜狠狠一区二区三区果冻| 97av免费视频| 亚洲欧洲免费视频| 人妖欧美1区| 国产精品嫩草影院一区二区| av综合网页| 中文字幕欧美日韩一区二区三区 | 久久人人爽av| 人人超碰91尤物精品国产| 日韩成人av影院| 国产精品久久久久久久蜜臀| 精品国产乱码一区二区| 天涯成人国产亚洲精品一区av| 国产又粗又黄又爽视频| 亚洲欧美中文在线视频| 黄色成人在线网| 成人信息集中地欧美| 国产欧美日韩免费观看 | 日韩精品电影一区亚洲| 中文字幕在线视频播放| 94色蜜桃网一区二区三区| 亚洲色图27p| 色综合天天视频在线观看| 亚洲精品喷潮一区二区三区| 最近更新的2019中文字幕| 亚洲优女在线| 国产精品久久不能| 九九热播视频在线精品6| 欧美 亚洲 视频| 久久99热这里只有精品| 一级黄色免费毛片| 欧美极品美女视频| 九九精品视频免费| 一级精品视频在线观看宜春院 | 男人的天堂亚洲一区| 国产成人av无码精品| 一区二区三区 在线观看视频 | 精品一区精品二区高清| 99久久久无码国产精品衣服| 一本大道久久a久久综合| 午夜福利视频一区二区| 亚洲深夜福利网站| 神马久久午夜| 国产精品久久久久久久小唯西川 | 丰满爆乳一区二区三区| 成人高清在线视频| 国产精品白浆一区二小说| 欧美本精品男人aⅴ天堂| 丝袜国产在线| 国产精品国产精品国产专区蜜臀ah| 午夜国产精品视频| 午夜诱惑痒痒网| 成人免费视频网站在线观看| 亚洲国产成人精品综合99| 欧美一卡二卡三卡| 一区二区三区伦理| av在线不卡一区| 影院欧美亚洲| 中国极品少妇videossexhd| 黄网站色欧美视频| 黄色小视频在线观看| 国产精国产精品| 婷婷亚洲综合| 国产一精品一aⅴ一免费| 午夜精品福利久久久| 天堂av在线7| 国产精品久久久久久久久久久久久久 | www.欧美日韩| 6080午夜伦理| 日韩在线视频中文字幕| 日韩三级久久| 国产免费一区二区三区视频| 中文字幕国产一区二区| 国产三级第一页| 韩国视频理论视频久久| 视频国产一区| 日韩a∨精品日韩在线观看| 99国内精品久久| 做爰无遮挡三级| 美女扒开尿口让男人操亚洲视频网站| 美女日韩欧美| 一区二区成人国产精品| 久久精品网址| 亚洲一区二区三区无码久久| 亚洲乱码精品一二三四区日韩在线| 国产极品久久久| 久久精品免费电影| 成人动漫视频| 噼里啪啦国语在线观看免费版高清版| ...xxx性欧美| 亚洲区小说区图片区| 国产精品自产拍高潮在线观看| 欧美视频在线观看| 夜夜春很很躁夜夜躁| 日韩欧美在线影院| 性欧美hd调教| 欧美一级爱爱视频| 欧美精彩视频一区二区三区| 亚洲男人天堂久久| 色综合久久悠悠|