偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C++基礎(chǔ)之面向?qū)ο缶幊趟枷耄ㄒ唬?/h1>

開(kāi)發(fā) 后端
本文介紹的是以C++程序語(yǔ)言為基礎(chǔ)的面向?qū)ο蟮木幊趟枷?。希望?duì)你有幫助,一起來(lái)看吧!

我們都知道,C++中最重要的概念——類(lèi),了解了類(lèi)之后,已經(jīng)可以開(kāi)始做些編程方面比較高級(jí)的應(yīng)用——設(shè)計(jì)程序,而不再只是將算法變成代碼。要說(shuō)明如何設(shè)計(jì)程序,有必要先了解何謂編程思想。建議大家閱讀這一系列的文章,供大家參考。

編程思想

編程,即編寫(xiě)程序,而之前已經(jīng)說(shuō)過(guò),程序就是方法的描述,那么編程就是編寫(xiě)方法的描述。我知道如何到人民公園,然后我就編寫(xiě)了到人民公園的方法的描述—— 從市中心開(kāi)始向東走400米再向右轉(zhuǎn)走200米就是。接著另一個(gè)人也知道如何去,但他編的程序卻是——從市中心沿人民東路走過(guò)兩個(gè)交叉口,在第三個(gè)交叉口處右轉(zhuǎn),直走就能在右手方看到。很明顯,兩個(gè)程序不同,但最后走的路線是相同的,即大家的方法相同,但描述不同。

所謂的編程思想,就是如何編程,即編寫(xiě)程序的方法。這也是為什么不同的人對(duì)同一算法編寫(xiě)出的程序不同(指程序邏輯,不是簡(jiǎn)單的變量或函數(shù)名不同),不同的人的編程思想不同。

如果多編或多看一些程序,就會(huì)發(fā)現(xiàn)編程思想是很重要的。好的編程思想編出的程序條理分明,可維護(hù)性高;差的編程思想編出的程序晦澀難懂,可維護(hù)性低。注意,這里是從程序的易讀性來(lái)比較的,實(shí)際出于效率,是會(huì)使用不符合人腦思維習(xí)慣的編程思想,進(jìn)而導(dǎo)致代碼的難于維護(hù),但為了效率還是會(huì)經(jīng)常在程序的瓶頸位置使用被優(yōu)化了的代碼(這種代碼一般使用匯編語(yǔ)言編寫(xiě),算法則很大程度上是數(shù)學(xué)上的優(yōu)化,丟棄了大部分其在人類(lèi)世界中的意義)。

本系列一直堅(jiān)持并推薦這么一個(gè)編程思想——一切均按照語(yǔ)義來(lái)編寫(xiě)。而語(yǔ)義是語(yǔ)言的意義,之前說(shuō)它是代碼在人類(lèi)世界中的意義。比如桌子,映射成一個(gè)結(jié)構(gòu),有桌腳數(shù)、顏色等成員變量,那么為什么沒(méi)有質(zhì)量、材料、價(jià)格、生產(chǎn)日期等成員?對(duì)此有必要說(shuō)明一下“人類(lèi)世界”的含義。

世界

我們生活在一個(gè)四維的客觀物理世界中,游戲中的怪物生活在游戲定義的游戲世界中,白雪公主生活在一個(gè)童話世界中。什么叫世界?世界即規(guī)則的集合。比如客觀世界中,力可作用于有質(zhì)量的物體上,并進(jìn)而按照運(yùn)動(dòng)學(xué)定律改變物體的速度;電荷異性相吸同性相斥;能量守恒等,這些都是對(duì)客觀世界這個(gè)規(guī)則的集合中的某些規(guī)則的描述。

注意它們都只是規(guī)則的描述,不是規(guī)則,就好像程序是方法的描述,但不是方法。即方法和規(guī)則都是抽象的邏輯概念,各自通過(guò)程序和論調(diào)來(lái)表現(xiàn)。程序就是我們要編寫(xiě)的,而論調(diào)就是一門(mén)理論,如概率論、運(yùn)動(dòng)學(xué)、流體力學(xué)等。而前面所說(shuō)的游戲世界,是因?yàn)橛螒蛞彩且幌盗幸?guī)則。

同樣,童話世界也是由一系列的規(guī)則組成。如白雪公主能吃東西,能睡覺(jué),并且能因?yàn)槌粤硕咎O(píng)果而中毒;魔鏡能回答問(wèn)題等。

那么就算了解了世界這個(gè)概念又怎樣?有什么用?前面說(shuō)了本系列是推薦按照語(yǔ)義來(lái)編寫(xiě)程序。而算法是基于某些規(guī)則的,如給出1到100求和的算法是(1+100)*100/2,這里就暗示已經(jīng)有那么些規(guī)則說(shuō)明什么是加減乘除,什么是求和。即一個(gè)算法一定是就一個(gè)世界來(lái)說(shuō)的,它在另一個(gè)世界可能毫無(wú)意義。因?yàn)樗惴ň褪欠椒?,是由之前說(shuō)的命令和被操作的資源組成,而命令和資源就是由世界來(lái)定義的。

前面說(shuō)根據(jù)算法寫(xiě)代碼,其實(shí)是先制訂了一個(gè)世界來(lái)做為算法展示的平臺(tái)。如之前的商人過(guò)河,其就在如下的一個(gè)規(guī)則集上表現(xiàn)的:有一只能坐兩人的船可以載人過(guò)河;有三個(gè)商人和三個(gè)仆人在河的一邊;河的任意一邊仆人數(shù)多過(guò)商人數(shù)商人就會(huì)被殺。這是對(duì)過(guò)河問(wèn)題所基于的世界的嚴(yán)重不準(zhǔn)確的描述,但在這過(guò)于抽象并沒(méi)什么好處,只用注意:上面的商人和仆人不是現(xiàn)實(shí)世界中的商人和仆人,他們不能吃飯不能睡覺(jué)不能講話,甚至連走路都不會(huì),唯一會(huì)的是通過(guò)坐船過(guò)河來(lái)改變自身的位置。當(dāng)某一位置(即河的某一岸)的仆人的實(shí)例多于商人的實(shí)例時(shí)(且商人的實(shí)例至少有一個(gè)),則稱(chēng)商人被殺。上面的描述暫且稱(chēng)為商人仆人論,它是對(duì)過(guò)河問(wèn)題所基于的世界的一個(gè)描述。

另一個(gè)人卻不像上面那樣看待問(wèn)題。河有兩個(gè)岸,每個(gè)河岸總對(duì)應(yīng)著兩個(gè)數(shù)字——商人數(shù)和仆人數(shù)。有一個(gè)途徑能按照某個(gè)規(guī)則改變河岸對(duì)應(yīng)的兩個(gè)數(shù)字(就是坐只能坐兩人的船過(guò)河),而當(dāng)任何一個(gè)河岸所對(duì)應(yīng)的仆人數(shù)多于商人數(shù)時(shí)(且商人數(shù)不為零),則稱(chēng)商人被殺。此人沒(méi)有定義商人和仆人這么兩個(gè)概念,而只定義了一個(gè)概念——河岸,此概念具有兩個(gè)屬性——商人數(shù)和仆人數(shù)。這是另一個(gè)論調(diào),暫且稱(chēng)為河岸論。

什么意思?上面就是對(duì)商人過(guò)河問(wèn)題所基于的世界的兩個(gè)不同論調(diào)。注意上面論調(diào)不同,但描述的都是同一個(gè)世界,就好像動(dòng)力學(xué)和量子力學(xué),都是對(duì)客觀世界物體之間作用規(guī)則的描述,但大相徑庭。算法總是基于一個(gè)世界,但更準(zhǔn)確點(diǎn)的說(shuō)法應(yīng)是算法總是基于一個(gè)世界的描述,而所謂的設(shè)計(jì)程序就是編寫(xiě)算法所基于的世界描述,即論調(diào),而論調(diào)其實(shí)就是問(wèn)題的描述。

現(xiàn)在考慮前面說(shuō)的商人仆人論和河岸論,它們都是同一世界的描述,但前者提出兩個(gè)名詞性概念——商人和仆人,各自具有“位置”這個(gè)狀態(tài)和“坐船”這么一個(gè)功能以及“商人被殺”這個(gè)動(dòng)詞性概念;后者提出一個(gè)名詞性概念——河岸,具有“商人數(shù)”和“仆人數(shù)”兩個(gè)屬性和“商人被殺”及“坐船”兩個(gè)動(dòng)詞性概念。

在此,說(shuō)后者比前者好,因?yàn)楹笳叨x的名詞性概念更少(即名詞性概念比動(dòng)詞性概念更容易增加架構(gòu)的復(fù)雜性,因?yàn)槠浯砹耸澜缰袞|西的種類(lèi),種類(lèi)越繁多則世界越復(fù)雜,越難以實(shí)現(xiàn)),雖說(shuō)不一定更容易理解,但結(jié)構(gòu)更簡(jiǎn)單。

易發(fā)現(xiàn),所有的論調(diào)都可以只由“名詞性概念”和“動(dòng)詞性概念”組成,其中前者在數(shù)學(xué)中就是數(shù)、實(shí)數(shù)、復(fù)數(shù)等,后者是加減乘除、求導(dǎo)等,它們都被稱(chēng)作定義。在《游戲論》中,我將前者稱(chēng)為類(lèi),而類(lèi)的實(shí)例就是方法中被操作的的資源,后者稱(chēng)為命令。

而在方法中,前者是資源的類(lèi)型,后者是操作的類(lèi)型。一個(gè)論調(diào),提出的概念越少,結(jié)構(gòu)就越簡(jiǎn)單,也就越好。但應(yīng)注意,就電腦編程來(lái)說(shuō),由于電腦并不是抽象的概念,而是存在效率因素的,因此基于前述的好的論調(diào)的算法而編出的代碼的運(yùn)行效率并不一定高。

因此,所謂的程序設(shè)計(jì),就是設(shè)計(jì)算法所基于的論調(diào),而好的程序設(shè)計(jì),就是相應(yīng)的論調(diào)設(shè)計(jì)得好。但前面說(shuō)了,效率并不一定高,對(duì)此,一般僅在代碼的瓶頸位置另外設(shè)計(jì),而程序的整體架構(gòu)依舊按照之前的設(shè)計(jì)。隨著程序的日趨龐大,清晰簡(jiǎn)明的程序架構(gòu)越顯重要,而要保持程序架構(gòu)的簡(jiǎn)明,就應(yīng)設(shè)計(jì)好的論調(diào);要保持架構(gòu)的清晰,就應(yīng)按照語(yǔ)義來(lái)編寫(xiě)代碼。下面,介紹如此風(fēng)靡的面向?qū)ο缶幊趟枷雭?lái)幫助設(shè)計(jì)程序。

何謂對(duì)象

 

要說(shuō)明面向?qū)ο螅紫葢?yīng)了解何謂對(duì)象。對(duì)象就是前述的“名詞性概念”的實(shí)現(xiàn),即一個(gè)實(shí)例。如商人仆人論中有商人和仆人兩個(gè)“名詞性概念”,其有三個(gè)商人和三個(gè)仆人,則稱(chēng)有六個(gè)對(duì)象,分別是三個(gè)商人的實(shí)例和三個(gè)仆人的實(shí)例。應(yīng)注意對(duì)象和實(shí)例的區(qū)別,其實(shí)它們沒(méi)有區(qū)別,如果非要說(shuō)區(qū)別,可以認(rèn)為對(duì)象能夠沒(méi)有狀態(tài),但實(shí)例一定有狀態(tài)。

那么什么叫狀態(tài)?還是先來(lái)看看什么叫屬性。桌子有個(gè)屬性叫顏色,這張桌子是紅色的而那張是綠的。人有個(gè)狀態(tài)叫臉色,這個(gè)人的臉色紅潤(rùn)而那個(gè)的慘白。都是顏色,但一個(gè)是屬性一個(gè)是狀態(tài),什么區(qū)別?

如果把桌子和人都映射成類(lèi),那么桌子的顏色和人的臉色都應(yīng)映射成相應(yīng)類(lèi)的成員變量,而兩者的區(qū)別就是桌子的實(shí)例在主要運(yùn)作過(guò)程中顏色都不變化,其主要用于讀;人的臉色在人的實(shí)例的主要運(yùn)作過(guò)程中可能變化,其主要用于寫(xiě)。什么叫運(yùn)作過(guò)程?類(lèi)映射的是資源,資源可以具有功能,即成員函數(shù),當(dāng)一個(gè)實(shí)例的功能執(zhí)行時(shí),就是這個(gè)實(shí)例的運(yùn)作過(guò)程。

桌子有個(gè)功能是“放東西”,當(dāng)調(diào)用這個(gè)成員函數(shù)時(shí),其中會(huì)讀取顏色這個(gè)屬性的值以判斷放在桌子上的東西的顏色是否和桌子的顏色搭配協(xié)調(diào)。人有個(gè)功能是“泡澡”,其可以使相應(yīng)實(shí)例的臉色從慘白向紅潤(rùn)轉(zhuǎn)變。但桌子也有個(gè)功能是“改變顏色”,調(diào)用它可以改變桌子的顏色。

按照前面所說(shuō),顏色是屬性,應(yīng)該被讀,但這里卻在實(shí)例的運(yùn)作過(guò)程中對(duì)它進(jìn)行了寫(xiě)操作。注意前面說(shuō)的是“主要運(yùn)作過(guò)程”,即桌子的目的是用來(lái)“放東西”,不是“改變顏色”。如果桌子這個(gè)概念在其相應(yīng)世界中主要是用來(lái)改變其顏色而不是放東西,此時(shí)桌子只不過(guò)是一個(gè)能記錄顏色值的容器,而這時(shí)桌子的顏色就是狀態(tài),不是屬性了。

有何意義?屬性和狀態(tài)都映射為成員變量,從代碼上是看不出它們的區(qū)別的,但它們的語(yǔ)義是有嚴(yán)重區(qū)別的。屬性是用來(lái)配置實(shí)例而狀態(tài)是用來(lái)表現(xiàn)實(shí)例。在面向?qū)ο缶幊趟枷胫校皇呛?jiǎn)單地說(shuō)對(duì)象是具有屬性和功能(也被稱(chēng)作方法)的實(shí)例,這在編寫(xiě)的程序所基于的世界比較復(fù)雜時(shí)顯得非常地孱弱,而且就是對(duì)“屬性”的錯(cuò)誤理解,再加上“封裝”這個(gè)詞匯的席卷,導(dǎo)致出現(xiàn)大量的荒謬代碼,后面說(shuō)明。

屬性和狀態(tài)的差別導(dǎo)致出現(xiàn)所謂的無(wú)狀態(tài)對(duì)象(在MTS——Microsoft Transaction Server中提出,稱(chēng)作Stateless Component,無(wú)狀態(tài)組件),這正是對(duì)象和實(shí)例的差別——對(duì)象是實(shí)現(xiàn),因此可以是一個(gè)抽象概念的實(shí)現(xiàn);實(shí)例是實(shí)際存在,不能是抽象概念的實(shí)現(xiàn)。這在 C++代碼上就表現(xiàn)為沒(méi)有成員變量的類(lèi)和有成員變量的類(lèi)。如下:

 

  1. struct Search { virtual int search( int*, intint ); };  
  2. Search a, b; int c[3] = { 10, 20, 5 }; a.search( c, 3, 20 ); 

 

這里就生成兩個(gè)對(duì)象a和b,它們都是抽象概念——搜索功能的對(duì)象。注意結(jié)構(gòu)Search沒(méi)有成員變量,因?yàn)椴恍枰敲碼和b的長(zhǎng)度是多少?由于可能出現(xiàn)下面的情況,一般的編譯器都將上面的a和b的長(zhǎng)度定為一個(gè)字節(jié),進(jìn)而&a就不等于&b。

 

  1. struct BSearch : public Search { int search( int*, intint ); };  
  2. Search *p; BSearch d; p = &a; p = &b; p = &d; p->search( c, 3, 5 ); 

 

注意從代碼上依舊可以稱(chēng)上面生成了Search的兩個(gè)實(shí)例a和b,BSearch的一個(gè)實(shí)例d(即使實(shí)際上它們根本不存在,邏輯上大小為零),這也就是為什么之前說(shuō)它和對(duì)象沒(méi)有區(qū)別,僅僅有概念上的微小差別。

應(yīng)注意前面提到的無(wú)狀態(tài)對(duì)象并不是說(shuō)沒(méi)有成員變量的類(lèi)的實(shí)例,只是沒(méi)狀態(tài),并不代表沒(méi)有屬性。如前面的BSearch可能有個(gè)屬性 m_MaxSearchTimes以表示折半搜索時(shí)如果搜索m_MaxSearchTimes那么多次仍沒(méi)找到,則BSearch::search返回沒(méi)找到。

雖然這里BSearch有了成員變量,但就邏輯上它還是一個(gè)抽象概念。由于屬性和狀態(tài)的實(shí)現(xiàn)相同(都通過(guò)成員變量),因此要實(shí)現(xiàn)無(wú)狀態(tài)對(duì)象需要一些特殊手段,由于與本系列無(wú)關(guān),在此不表。

前面的a和b有區(qū)別嗎?為什么要有兩個(gè)實(shí)例?“搜索功能”按照之前說(shuō)的語(yǔ)義不是更應(yīng)該映射為函數(shù)?為什么要映射成沒(méi)有成員變量的類(lèi)?上面的用法在 STL(Standard Template Library——標(biāo)準(zhǔn)模版庫(kù))中被使用,做了一些變形,稱(chēng)作函數(shù)類(lèi),是一種編程技巧。

但的確有這種語(yǔ)義——查找功能有三個(gè)參數(shù):查找條件、查找位置(即欲搜索的容器或集合)、查找前排序容器或集合的方法。這里傳遞函數(shù)指針不是剛剛好嗎(實(shí)際并不剛剛好,指針的語(yǔ)義是引用,在這并不很準(zhǔn)確)?這就是所謂的面向?qū)ο缶幊趟枷搿?/p>

接下一篇,C++基礎(chǔ)之面向?qū)ο缶幊趟枷耄ǘ?/span>

責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-14 17:37:02

C++面向?qū)ο缶幊趟枷?/a>

2023-04-26 00:15:32

python面向?qū)ο?/a>java

2011-08-04 11:04:14

Objective-C 面向?qū)ο? 繼承

2010-01-20 09:48:44

面向?qū)ο?/a>

2010-08-24 16:00:43

C語(yǔ)言

2010-01-19 15:36:02

C++語(yǔ)言

2025-04-02 03:11:00

Python函數(shù)C++

2024-01-03 13:38:00

C++面向?qū)ο缶幊?/a>OOP

2020-04-15 11:07:31

C語(yǔ)言對(duì)象思想

2009-06-22 13:48:00

Java編程思想面向?qū)ο?/a>

2020-12-24 08:36:14

Java類(lèi)Java基礎(chǔ)

2011-07-05 14:42:46

java

2011-05-25 10:21:44

Javascript

2011-05-13 09:58:46

javascript

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對(duì)象編程

2010-01-13 14:05:55

C++語(yǔ)言

2009-12-22 01:54:50

C++之父Bjarne Stro

2021-10-20 18:44:43

編程對(duì)象JavaScript

2009-11-23 19:24:01

PHP面向?qū)ο缶幊?/a>
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)