精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩精品在线观看一区| 99久久婷婷国产综合精品| 亚洲系列中文字幕| 国产精品亚洲аv天堂网| 中文字幕av久久| 91精品国产乱码久久| 国产一区日韩欧美| 亚洲天堂第二页| 青娱乐国产精品视频| 蜜桃视频www网站在线观看| 亚洲国产精品ⅴa在线观看| 99电影在线观看| 久久久久在线视频| 欧美在线免费| 国产一区二区三区直播精品电影| 久草福利在线观看| 搜成人激情视频| 亚洲人成在线观看一区二区| 欧美成人vps| 欧美福利在线观看| 免费一级做a爰片久久毛片潮| 亚洲精品69| 欧美天堂在线观看| 日本美女爱爱视频| 超碰免费97在线观看| 成人免费毛片片v| 国产欧美日韩精品专区| 日韩免费观看一区二区| 久久久9色精品国产一区二区三区| 亚洲成人中文字幕| 在线一区二区不卡| 户外露出一区二区三区| 亚洲成人黄色影院| 免费观看黄色大片| 国产福利片在线| 91麻豆福利精品推荐| 亚洲一区二区在线| 国产99免费视频| 国产欧美激情| 欧美精品电影免费在线观看| 色哟哟一一国产精品| 欧美日韩激情在线一区二区三区| 亚洲国产精品va在线观看黑人| 超碰在线资源站| www.26天天久久天堂| 日韩欧美在线国产| 国产精品宾馆在线精品酒店| 国产区美女在线| 夜夜嗨av一区二区三区中文字幕 | 最新中文字幕一区| 黄色在线一区| 欧美国产视频日韩| 九九热视频精品| 亚洲成人最新网站| 久久久www成人免费精品| 亚洲午夜久久久久久久国产| 亚洲人成网站77777在线观看| 激情婷婷综合| 亚洲不卡av一区二区三区| 国产免费一区二区三区四在线播放 | 久久人人爽人人爽人人片| 粉嫩av一区二区| 精品久久国产老人久久综合| 亚洲视频 中文字幕| www.丝袜精品| 日韩成人高清在线| 黄色在线观看av| 国产一区二区精品福利地址| 一区二区福利视频| 国产黄色片在线| 99国产精品一区二区| 久久久国产在线视频| 杨钰莹一级淫片aaaaaa播放| 欧美精品97| 高清欧美性猛交xxxx黑人猛交| 日本乱子伦xxxx| 日韩伦理一区| 久久av红桃一区二区小说| 久久久国产精品黄毛片| 国产精品亚洲产品| 国产精品扒开腿做爽爽爽男男 | 不卡av免费观看| 婷婷国产在线综合| 国产精品igao| 国产精品亚洲欧美一级在线 | 国产精品久久久久久影视| 在线观看视频二区| 国产白丝网站精品污在线入口| 国产女主播一区二区| 神马电影在线观看| 中文字幕在线不卡视频| 免费日韩在线观看| 蜜臀国产一区| 91精品国产综合久久久蜜臀图片| 久久人妻少妇嫩草av蜜桃| 国产精品自偷自拍| 亚洲天堂1区| 欧美综合欧美视频| 熟女人妻一区二区三区免费看| 久久悠悠精品综合网| 自拍偷拍亚洲欧美| 久久亚洲AV无码| 日本在线观看不卡视频| 91久久爱成人| 免费看男男www网站入口在线| 亚洲私人黄色宅男| 无码精品a∨在线观看中文| 岛国一区二区| 亚洲国产高清自拍| 欧美风情第一页| 国产美女一区| 亚洲综合在线做性| 国产在线日本| 亚洲成av人**亚洲成av**| 国产免费视频传媒| 韩国女主播一区二区三区| 最近中文字幕mv在线一区二区三区四区| 动漫性做爰视频| 天堂一区二区在线| 国产传媒一区二区三区| 日本在线免费| 在线日韩一区二区| 中文乱码人妻一区二区三区视频| 欧美好骚综合网| 欧美综合激情网| www.色播.com| 一区免费观看视频| 国产福利一区视频| 久久大胆人体视频| 久久99视频精品| 一级片在线免费观看视频| 2023国产精品自拍| 国产精品久久..4399| 亚洲三区欧美一区国产二区| 色香阁99久久精品久久久| 天天综合天天干| 9人人澡人人爽人人精品| 国产资源第一页| 日韩欧美激情| 中文字幕精品久久久久| 午夜精品一区二| 久久久久久久综合色一本| 少妇高潮大叫好爽喷水| 黑人一区二区三区| 在线丨暗呦小u女国产精品| 无码无套少妇毛多18pxxxx| 97精品国产露脸对白| 欧美图片激情小说| a看欧美黄色女同性恋| 蜜臀久久99精品久久久无需会员| 最新黄色网址在线观看| 国产欧美视频在线观看| 国产欧美高清在线| 国产一区三区在线播放| 日韩av色综合| 精品久久av| 在线免费观看一区| 久久久国产一级片| 美腿丝袜亚洲三区| 亚洲国产高清国产精品| 欧美综合影院| 久久精品久久久久久| a毛片在线免费观看| 一区二区三区四区蜜桃| 国产精品91av| 亚洲经典三级| 欧美精品在线一区| 777午夜精品电影免费看| 中文字幕av一区二区| 91片黄在线观看喷潮| 亚洲久草在线视频| 亚洲av午夜精品一区二区三区| 伊人久久综合| 美女主播视频一区| 欧美性www| 欧美大片免费看| 天天干,夜夜操| 色94色欧美sute亚洲线路一ni | 少妇一区二区视频| 国产精品偷伦一区二区| 神马午夜伦理不卡| 精品丝袜一区二区三区| 五月婷婷激情五月| 亚洲免费观看高清| 蜜桃精品成人影片| 麻豆中文一区二区| 福利视频一区二区三区四区| 午夜欧洲一区| 91九色综合久久| 黑人精品视频| 中日韩美女免费视频网站在线观看 | 一本久道综合久久精品| 日本日本精品二区免费| 国内精品视频| 欧美一级电影免费在线观看| 午夜视频在线| 日韩成人久久久| 91亚洲国产成人久久精品麻豆| 亚洲一二三四区不卡| 成人黄色a级片| 大美女一区二区三区| 99视频精品免费| 国产精品大片免费观看| 视频一区二区综合| 狠狠一区二区三区| 成人免费淫片aa视频免费| 九色porny视频在线观看| 久久精品国产v日韩v亚洲| 色猫av在线| 日韩女优毛片在线| 日韩不卡高清视频| 亚洲成人激情av| 五月天激情丁香| 久久久综合网站| 国产精品入口麻豆| 国产乱一区二区| 国产自偷自偷免费一区| 99xxxx成人网| 国产乱子伦精品无码专区| 日韩成人综合| 欧美精品二区三区四区免费看视频 | 91久久人澡人人添人人爽欧美| 久草网在线观看| 中文字幕一区在线| a级片在线观看| 91亚洲精品久久久蜜桃| avtt中文字幕| 韩国精品一区二区| 天天色综合社区| 天堂蜜桃91精品| 欧洲黄色一级视频| 欧美日韩精品一本二本三本| 一区二区三区的久久的视频| 怕怕欧美视频免费大全| 精品国产乱码久久久久久郑州公司| 国产在线一区不卡| 成人看片人aa| 四虎精品在线观看| 国产精品香蕉在线观看| 日本欧美韩国| 国产精品久久久久9999| 国产精品伦理| 茄子视频成人在线| 小早川怜子影音先锋在线观看| 国产69精品久久久| 国产三线在线| 性色av一区二区咪爱| 金瓶狂野欧美性猛交xxxx| 欧美成人一区二区三区电影| 黄色免费在线观看| 久久精品国产精品| а√天堂8资源在线官网| xvideos国产精品| 麻豆视频在线免费观看| www.色综合| 麻豆免费在线视频| 久久夜色撩人精品| 国产激情小视频在线| 欧美猛交免费看| 免费在线播放电影| 久久免费视频在线| 成人三级高清视频在线看| 97香蕉超级碰碰久久免费的优势| sm在线观看| 欧美一级视频一区二区| 韩国美女久久| 国产精品视频区| 91国产精品| 97久久天天综合色天天综合色hd | 精品捆绑美女sm三区| 亚洲精品一区二区三区区别| 亚洲国产高清高潮精品美女| 免费理论片在线观看播放老| 最近2019年手机中文字幕| 在线观看男女av免费网址| 国内精品久久久久久久| 不卡av影片| 91久久久久久久久久久| 9l视频自拍蝌蚪9l视频成人| 久久精品国产一区二区三区不卡| 国产精品一区二区av交换| 夜夜春亚洲嫩草影视日日摸夜夜添夜 | 精品免费视频一区二区| 污污的视频网站在线观看| 亚洲人线精品午夜| 浪潮av一区| 97激碰免费视频| 精品欧美日韩精品| 99九九电视剧免费观看| 蜜桃精品wwwmitaows| 正在播放一区二区三区| 亚洲三级色网| 欧美性受xxxxxx黑人xyx性爽| 成人免费av资源| 貂蝉被到爽流白浆在线观看| 亚洲一区二区在线播放相泽| 五月婷婷激情视频| 欧美一级欧美一级在线播放| 女人天堂在线| 欧美日韩电影在线观看| 亚州一区二区三区| 国产日韩一区欧美| 9999国产精品| 91精品91久久久中77777老牛| 精品一区中文字幕| 播金莲一级淫片aaaaaaa| 1024成人网| 在线观看日本视频| 欧美成人精品二区三区99精品| 久久国产精品高清一区二区三区| 欧美www在线| 国产亚洲一区二区手机在线观看 | 少妇黄色一级片| 成人免费视频caoporn| 老司机成人免费视频| 日韩欧美在线免费观看| 亚洲第一黄色片| www.欧美三级电影.com| 天天综合网站| 极品日韩久久| 欧美人成在线| 五月激情婷婷在线| 久久女同性恋中文字幕| 日本少妇毛茸茸高潮| 91麻豆精品91久久久久同性| 天天干天天做天天操| 欧美激情一区二区三区久久久 | 欧美色爱综合网| 日韩二区三区| 91爱视频在线| 国产精品香蕉| 国产肉体ⅹxxx137大胆| 国产真实乱对白精彩久久| 国产主播av在线| 在线精品视频免费播放| 青青草在线视频免费观看| 久久免费视频在线| 国产福利资源一区| 黄色一级片国产| 国产iv一区二区三区| 久久国产波多野结衣| 3d动漫精品啪啪1区2区免费| 91这里只有精品| 国产精品午夜视频| 欧美hd在线| 中文字幕丰满乱码| 亚洲视频香蕉人妖| 国产精品视频在线观看免费| 久久精品成人欧美大片古装| 自拍偷拍欧美日韩| 中文字幕一区二区三区精彩视频 | 精品国产一二区| 亚洲一区av在线| 日韩中文字幕免费在线观看| 欧美极品在线视频| 国产ts一区| 国产女大学生av| 久久婷婷国产综合精品青草| 中文字幕黄色片| 亚洲小视频在线观看| 国产精品伊人| 亚洲第一综合网站| 成人做爰69片免费看网站| 日本熟妇色xxxxx日本免费看| 亚洲国产欧美一区二区丝袜黑人 | 在线精品视频一区二区三四| av电影在线观看一区二区三区| 国产欧美在线视频| 一区二区不卡| 这里只有精品在线观看视频| 欧美日韩国产专区| 国产视频二区在线观看| 成人a在线观看| 国产精品videossex久久发布| 大尺度做爰床戏呻吟舒畅| 欧美日韩午夜视频在线观看| 岛国视频免费在线观看| 成人久久18免费网站图片| 欧美私人啪啪vps| 国产精品无码网站| 欧美性视频一区二区三区| caopon在线免费视频| 丁香婷婷久久久综合精品国产| 一本色道久久| 精品丰满少妇一区二区三区| 日韩欧美一级精品久久| 日韩伦理在线一区| 亚洲蜜桃在线| jlzzjlzz亚洲日本少妇| 69视频免费看| 欧美激情视频免费观看| 精品一区二区三区的国产在线观看| www.久久久久久久久久久| 精品久久久中文| 伦xxxx在线| 欧美不卡三区| 国产精品一区二区久久不卡| 成人h动漫精品一区二区下载| 久久精品国产v日韩v亚洲| 亚洲小说图片|