C++個(gè)人復(fù)習(xí)資料_第1頁(yè)
C++個(gè)人復(fù)習(xí)資料_第2頁(yè)
C++個(gè)人復(fù)習(xí)資料_第3頁(yè)
C++個(gè)人復(fù)習(xí)資料_第4頁(yè)
C++個(gè)人復(fù)習(xí)資料_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+復(fù)習(xí)大綱#類中每個(gè)非靜態(tài)成員函數(shù)內(nèi)部隱含有this,構(gòu)造和析構(gòu)也是有的。this的值可以訪問,不可以修改的,因?yàn)樵诰哂衪his成員函數(shù)中是不能定義該類的對(duì)象的。# C+派生構(gòu)造函數(shù)的構(gòu)造問題: 根據(jù)繼承的順序以及子對(duì)象的聲明定義順序來(lái)完成派生類構(gòu)造函數(shù)的初始化操作、最后再是派生類自己的構(gòu)造內(nèi)容執(zhí)行,注意this的活用,以及菱形繼承的問題。#重定位(地址映射): 把用戶程序中的相對(duì)地址(邏輯地址)轉(zhuǎn)換為主存中的絕對(duì)地址(物理地址)過程。8.靜態(tài)重定位:編譯時(shí)產(chǎn)生相對(duì)地址,裝入程序確定要裝入模塊的地址,并在裝入時(shí)進(jìn)行重定位,程序運(yùn)行中不允許在內(nèi)存移動(dòng)。9.動(dòng)態(tài)重定位:編譯時(shí)產(chǎn)生相對(duì)地址,裝入程

2、序在把裝入模塊裝入內(nèi)存時(shí),不立即把裝入模塊中的相對(duì)地址轉(zhuǎn)換為絕對(duì)地址,而是推遲到程序要真正執(zhí)行時(shí)才進(jìn)行#我們 這里先 執(zhí)行 scanf("%d %d", &n, &m),讀入2個(gè)整數(shù),n,m, (scanf函數(shù)返回成功讀入數(shù)據(jù)的個(gè)數(shù))1、返 2 - 如果成功 讀入了這2個(gè)數(shù)2、返 1 - 如果只成功 讀入了1個(gè)數(shù)3、返 0 - 如果輸入失敗。( scanf("%d %d", &n, &m), n+m) - 這是“逗號(hào)”表達(dá)式。第一個(gè) 表達(dá)式 是 scanf("%d%d", &n, &m)

3、,第二個(gè) 表達(dá)式 是 n+m;再執(zhí)行n+m, 這里的 n m 用 scanf讀 入的 值;“逗號(hào)”表達(dá)式 結(jié)果 等于 n+m“逗號(hào)”表達(dá)式 運(yùn)算順序從左到右依表達(dá)式次序執(zhí)行,但是 ,“逗號(hào)”表達(dá)式 的結(jié)果 等于 最后一個(gè) 表達(dá)式的結(jié)果。那么 while(scanf(“%d,%d,%*c”,&n,&m),n+m) 的意思是什么,注意 scanf里指定的 輸入字符分隔符 為 , 號(hào),輸入 也得 這么 分割。#定義在main()外的為全局變量,在整個(gè)程序文件中都可以調(diào)用,定義在main()函數(shù)內(nèi)的變量為局部變量,只有在該函數(shù)內(nèi)調(diào)用。#函數(shù)內(nèi)是在棧分配內(nèi)存,棧大小一般限制在1M到2M函

4、數(shù)外則是全局變量,在DATA段分配內(nèi)存,主函數(shù)內(nèi)是定義在棧里的,一般棧比較小,所以就被你搞崩潰了 。#按數(shù)量級(jí)遞增排列,常見的時(shí)間復(fù)雜度有: 常數(shù)階O(1),對(duì)數(shù)階O(log2n),線性階O(n), 線性對(duì)數(shù)階O(nlog2n),平方階O(n2),立方階O(n3),., k次方階O(nk),指數(shù)階O(2n)。隨著問題規(guī)模n的不斷增大,上述時(shí)間復(fù)雜度不斷增大,算法的執(zhí)行效率越低。 2、空間復(fù)雜度 與時(shí)間復(fù)雜度類似,空間復(fù)雜度是指算法在計(jì)算機(jī)內(nèi)執(zhí)行時(shí)所需存儲(chǔ)空間的度量。記作: S(n)=O(f(n)# for(int j=1; j<=n; j*=2)這個(gè)循環(huán)最終執(zhí)行的次數(shù)假設(shè)為x,則x次的時(shí)

5、候j=2x 當(dāng)j>n時(shí)停止執(zhí)行,于是2x>n 則可以認(rèn)為該循環(huán)一共執(zhí)行了log2(n)次所以該循環(huán)的時(shí)間復(fù)雜度為o(log2(n)簡(jiǎn)記為o(log n) 忽略掉2的底數(shù); 懂為什么忽略掉底數(shù)嗎,你將log2(n)轉(zhuǎn)化為以10為底的自然對(duì)數(shù),通過換底公式進(jìn)行轉(zhuǎn)化,就知道log2(n)和log n也就只是相差一個(gè)常數(shù)的關(guān)系,在考慮數(shù)量級(jí)的問題上我們是不考慮常數(shù)的影響的。所以如此,并且一個(gè)算法花費(fèi)的時(shí)間與算法中語(yǔ)句的執(zhí)行次數(shù)成正比例。#在調(diào)用構(gòu)造函數(shù)時(shí),不必給出實(shí)參的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù) #重載的多態(tài)性 繼承的多態(tài)性 參數(shù)的多態(tài)性 運(yùn)行時(shí)的多態(tài)性 強(qiáng)制轉(zhuǎn)換的多態(tài)性#引用可以

6、不初始化存在于類內(nèi)和形參中 #輸出型參數(shù)(&和指針)相當(dāng)于返回了多個(gè)參數(shù). 輸入型參數(shù)是為了將數(shù)據(jù)傳進(jìn)來(lái)(函數(shù))  輸出型參數(shù)是為了將數(shù)據(jù)傳出去 #類的成員函數(shù)中,除了用inline定義的成員函數(shù)為內(nèi)聯(lián)函數(shù)外,沒有其他方法來(lái)定義內(nèi)聯(lián)函數(shù)了。 (X) 因?yàn)樵陬悆?nèi)定義的成員函數(shù)就被認(rèn)為是內(nèi)聯(lián)函數(shù) 在類外定義的函數(shù)就被認(rèn)為是外聯(lián)函數(shù) 當(dāng)然你如果加了inline說(shuō)明就另當(dāng)別論了 #構(gòu)造函數(shù)和析構(gòu)函數(shù)一定是公有的  析構(gòu)函數(shù)不能帶有任何參數(shù) 不返回任何值 void類型也不行  #類的嵌套中內(nèi)部類和

7、外部類之間的關(guān)系 根據(jù)類的成員限定符的性質(zhì) 我們可以知道外部類也是無(wú)法直接訪問內(nèi)部類的私有成員的,因?yàn)閷?duì)內(nèi)部類而言,外部類就是它的外面 對(duì)外部類而言,內(nèi)部類就是他的外面 但我們知道內(nèi)部類對(duì)外部程序是不可見的,也就是說(shuō)外部的概念就是該類的第一層外面,如果是2層或以上的外面都是不可見的 #友元類不能繼承是什么意思   意思是說(shuō)你爸和他爸是好朋友  然而你和他爸就不是好朋友  指的是友元關(guān)系不能被繼承 ;但子類可以通過父類的函數(shù)(接口)去訪問相應(yīng)的友元類所有數(shù)據(jù) ;#關(guān)于運(yùn)算表達(dá)式的說(shuō)明:  1:&#

8、160;首先看有無(wú)運(yùn)算符重載函數(shù) 2:看有無(wú)類型轉(zhuǎn)換函數(shù) 3:看有無(wú)轉(zhuǎn)換構(gòu)造函數(shù)  #自身類對(duì)象不能作為該類的成員 友元函數(shù)使得可以通過對(duì)象名去引用私有成員 #友元普通函數(shù)就是單單作為朋友的函數(shù)   友元成員函數(shù)是指成員函數(shù)作為朋友的函數(shù)  #類模板的實(shí)例化具體化 定義類模板的一般規(guī)則 :先生成虛擬類型名  再用虛擬類型名去定義類   在類模板外定義成員函數(shù)時(shí),注意帶參數(shù)的類    類模板也可繼承派生 &#

9、160;#*(即指針變量): 4個(gè)字節(jié)(32位機(jī)的尋址空間是4個(gè)字節(jié),所以指針變量所分配的內(nèi)存單元大小為4Byte。同理64位機(jī)器,就是8Byte了)(變化*);unsigned long/long數(shù)據(jù)類型在 32位機(jī) 和 64位機(jī)下 所分配的內(nèi)存單元 也是不一樣的, 前者4Byte,后者8Byte。其他數(shù)據(jù)類型都是一樣的;#定義一個(gè)數(shù)據(jù)類型為整型的變量a;定義一個(gè)基類型為整型 的 指針型變量;#數(shù)組空間的分配是在堆里分配的,指針、引用類型、函數(shù)等都是在棧中分配的,具體請(qǐng)參看如下內(nèi)容:#遞歸問題:在進(jìn)行函數(shù)的遞歸操作時(shí),每次的遞歸都得是return語(yǔ)句,不然僅僅只有最后一層的遞歸return是

10、無(wú)法返回到函數(shù)的第一層調(diào)用那里的,只會(huì)返回到上一層而已(而不是第一層):遞歸語(yǔ)句必須是return語(yǔ)句,所以你會(huì)發(fā)現(xiàn)你莫名奇妙的返回了None;再者對(duì)于“二分查找”:你一定要想好,查找只會(huì)有兩種結(jié)果,一種是查找的到,一種是查找不到,而查找到和查找不到的臨界條件,一定要選擇好,不然就會(huì)有BUG 。 分析問題就應(yīng)該考慮的完全才是。#構(gòu)造函數(shù)-拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))系統(tǒng)提供默認(rèn)拷貝構(gòu)造函數(shù)的條件是不存在下列任意一種情況:類中有const成員;類中有引用類型成員;類或它的基類中有私有拷貝構(gòu)造函數(shù)。#overview  概述,overload 重載,override 重寫#實(shí)例

11、變量和實(shí)例方法:實(shí)例對(duì)象的變量和方法就是實(shí)例變量和實(shí)例方法,既產(chǎn)生實(shí)例對(duì)象后才具有的變量和方法#C+叫成員訪問限制符#Java中為什么沒有單獨(dú)把類聲明為private的用法,因?yàn)橐粋€(gè)類聲明如此的話,請(qǐng)問外界怎么用它,不就與世隔絕了嗎,沒有任何意義,這和最終類(不能派生的類)沒有區(qū)別,所以沒有這種用法#字符串之間比較大小是按字典序進(jìn)行比較的,返回的是ASCII碼比較的差值#定義類的指針是不會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù) #抽象類可以有構(gòu)造函數(shù)的 相應(yīng)的也會(huì)有析構(gòu)函數(shù) #MFC中并不是所有的類都是從CObject類派生而來(lái)的,例如CRect  CString &#

12、160;CPoint#類中每個(gè)非靜態(tài)成員函數(shù)內(nèi)都隱含有this 也包括構(gòu)造函數(shù)和析構(gòu)函數(shù) #this的值是不可以修改的#面向?qū)ο蟪绦蛟O(shè)計(jì)具有重用性好,擴(kuò)展性好和維護(hù)性好的優(yōu)點(diǎn) #單獨(dú)的一個(gè)分號(hào),表示什么都不做  是一個(gè)空的語(yǔ)句 #即便派生類構(gòu)造函數(shù)沒有對(duì)基類構(gòu)造函數(shù)作顯示的初始化, 也會(huì)自動(dòng)調(diào)用其基類的構(gòu)造函數(shù)完成相關(guān)的操作#cout模認(rèn)是以整形形式處理數(shù)據(jù)的 例如float a=3.0 cout<<a;只會(huì)輸出3而已  不像C語(yǔ)言里的嚴(yán)格按照格式輸出   printf("%f",a

13、)   輸出3.000000#經(jīng)過測(cè)試 , #include < >和#include " " 都是可以的,都可以在其中加上必要的路徑說(shuō)明; 但表示的含義是不一樣的#這是由內(nèi)聯(lián)函數(shù)的特殊性所決定的,由于內(nèi)聯(lián)是調(diào)用處展開的方式,所以編譯器認(rèn)為只有足夠簡(jiǎn)單的函數(shù)才可以具有該特性,復(fù)雜函數(shù)編譯器會(huì)放棄內(nèi)聯(lián)特性。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),僅僅省去了函數(shù)調(diào)用的開銷,從而提高函數(shù)的執(zhí)行效率。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更

14、多的內(nèi)存空間。#首先按照繼承的順序進(jìn)行初始化,然后按照定義的順序,最后便是花括號(hào) #在調(diào)用構(gòu)造函數(shù)時(shí),不必給出實(shí)參的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù) #引用可以不初始化存在于類內(nèi)和形參中 #重載的多態(tài)性 繼承的多態(tài)性 參數(shù)的多態(tài)性 運(yùn)行時(shí)的多態(tài)性 強(qiáng)制轉(zhuǎn)換的多態(tài)性#輸出型參數(shù)(&和指針)相當(dāng)于返回了多個(gè)參數(shù). 輸入型參數(shù)是為了將數(shù)據(jù)傳進(jìn)來(lái)(函數(shù)) 輸出型參數(shù)是為了將數(shù)據(jù)傳出去 數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu):順序存儲(chǔ)方式,鏈?zhǔn)酱鎯?chǔ)方式,索引存儲(chǔ)方式,散列存儲(chǔ)方式存儲(chǔ)分配方式:靜態(tài)分配方式,自動(dòng)分配方式和動(dòng)態(tài)分配方式Free(e) 動(dòng)態(tài)內(nèi)存存儲(chǔ)釋放函數(shù) mall

15、oc() 動(dòng)態(tài)內(nèi)存存儲(chǔ)分配函數(shù)Calloc() 計(jì)數(shù)動(dòng)態(tài)內(nèi)存存儲(chǔ)分配函數(shù) realloc() 重置內(nèi)存存儲(chǔ)分配函數(shù)#變量用點(diǎn),指針用箭頭#線性表,顧名思義,就是線性的表,只不過表中的每個(gè)元素,數(shù)據(jù)類型是相同的;而順序存儲(chǔ)結(jié)構(gòu)的線性表就是 順序表,鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的線性表 就是 鏈表;其中鏈表又分為單向鏈表和雙向鏈表;帶頭節(jié)點(diǎn)的單向鏈表和不帶頭節(jié)點(diǎn)的單向鏈表;(本章概念:頭插法,尾插法)。同樣,棧也有 順序棧 和 鏈?zhǔn)綏5母拍?,?duì)列有 順序隊(duì)列 和 鏈?zhǔn)疥?duì)列。 棧的特點(diǎn)是 先進(jìn)后出,后進(jìn)先出;隊(duì)列的特點(diǎn)是 先進(jìn)先出,后進(jìn)后出;#采用順序存儲(chǔ)方式的線性表稱為順序表,順序存儲(chǔ)結(jié)構(gòu)是由一組地址連續(xù)的內(nèi)存單

16、元組成的;#32 48 65 97 請(qǐng)問分別對(duì)應(yīng)ASCII碼的哪個(gè)字符;ASCII碼的取值范圍是0127,即128個(gè)字符,用了7個(gè)bit來(lái)表示,高位為0;絕大多數(shù)計(jì)算機(jī)的一個(gè)字節(jié)是8位,取值范圍是0255,而ASCII碼并沒有規(guī)定編號(hào)為128255的字符,有的廠商制定了擴(kuò)展ASCII碼,以支持更多的字符,但是他們并不屬于ASCII標(biāo)準(zhǔn);#free()動(dòng)態(tài)內(nèi)存存儲(chǔ)釋放函數(shù),只是釋放指針指向的內(nèi)存地址單元,但指針的存儲(chǔ)單元空間并沒有得到釋放,可是我們的指針又是臨時(shí)分配的局部變量,一旦調(diào)用完就被撤銷了,所以這又是安全的;#緩存是一個(gè)到處都存在的用空間換時(shí)間的例子。通過使用多余的空間,我們能夠獲取更快

17、的速度。#采用參數(shù)初始化表的形式來(lái)完成對(duì)象的初始化操作;#在類內(nèi)定義成員函數(shù),以及 在 類外 定義成員函數(shù); #析構(gòu)函數(shù) 不允許 重載;因?yàn)橐粋€(gè)類中 只能有一個(gè) 析構(gòu)函數(shù),默認(rèn)構(gòu)造函數(shù) 也只能 有一個(gè),多了 會(huì)有歧義;#當(dāng)類中已有默認(rèn)構(gòu)造函數(shù)時(shí),系統(tǒng)就不會(huì)提供不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)了,否則歧義;話,#常數(shù)據(jù)成員 以及 常成員函數(shù)#重載:同名不同參(參數(shù)的個(gè)數(shù)和類型不一致); 重寫:既要同名又要同參;#指向?qū)ο蟮某V羔槪?和 指向常對(duì)象的 指針;#類是對(duì)象的抽象,對(duì)象是類的實(shí)例化; 模板類是類的抽象化,C語(yǔ)言中的結(jié)構(gòu)體只能包含數(shù)據(jù)成員,不能有成員函數(shù)!變量的生存時(shí)間以及變量的作用范圍在C+中,結(jié)

18、構(gòu)體是一種特殊的類,類中可以使用的,結(jié)構(gòu)體中也可以使用,只不過默認(rèn)情況下,結(jié)構(gòu)體中的成員默認(rèn)訪問權(quán)限是public,類中默認(rèn)是private具有默認(rèn)值的參數(shù)必須放在后面 答案是32,想想為什么,不難,就是要小心;解析:這里實(shí)際上就是問你,程序一共會(huì)產(chǎn)生多少個(gè)進(jìn)程;本身這個(gè)C程序就 需要產(chǎn)生一個(gè)進(jìn)程,更何況,每執(zhí)行一次for循環(huán),就會(huì)產(chǎn)生一個(gè)進(jìn)程(子進(jìn)程),而子進(jìn)程由于和父進(jìn)程的程序段,數(shù)據(jù)段,棧段是一樣的,所以 1(main進(jìn)程自身)*2*2*2*2*2 = 25 = 32 個(gè)進(jìn)程;(5次for循環(huán),就乘以了5次2)這道題唯一的不同點(diǎn),在于多了個(gè) 打印操作;而我們fork()系統(tǒng)調(diào)用又在pri

19、ntf之前,那么父子進(jìn)程都會(huì)執(zhí)行printf語(yǔ)句,第一次for循環(huán)時(shí),有2個(gè)進(jìn)程,就有2個(gè)-打印,第二次有4個(gè)進(jìn)程,就有4個(gè)-打印,第三次有8個(gè)進(jìn)程就有8個(gè)-打印,第四次有16個(gè)進(jìn)程就有16個(gè)-打印,這樣全部加起來(lái) 就是 2+4+8+16=30 ;因?yàn)閒or循環(huán)的存在,導(dǎo)致每個(gè)進(jìn)程在又能回到 fork()調(diào)用前,所以可以多次輸出-,即我們這里認(rèn)為 每次for循環(huán)有多少個(gè)進(jìn)程,就有多少個(gè) - 輸出。對(duì)象的賦值和對(duì)ng象的復(fù)制;C+系統(tǒng)自動(dòng)提供的函數(shù)有:不帶參數(shù)的構(gòu)造函數(shù),析構(gòu)函數(shù),復(fù)制構(gòu)造函數(shù);從無(wú)到有叫初始化,初始化(調(diào)用拷貝構(gòu)造函數(shù))創(chuàng)建了新對(duì)象;賦值(調(diào)用賦值運(yùn)算符)沒有創(chuàng)建新對(duì)象,而是把

20、已有的對(duì)象賦值; 普通構(gòu)造函數(shù)在于單純的新建+初始化;復(fù)制構(gòu)造函數(shù)在于用舊對(duì)象給新建的對(duì)象賦值;靜態(tài)局部變量就是靜態(tài)變量的一種;靜態(tài)存儲(chǔ)區(qū),動(dòng)態(tài)存儲(chǔ)區(qū),靜態(tài)局部變量,靜態(tài)變量分為靜態(tài)局部變量和靜態(tài)全局變量;靜態(tài)數(shù)據(jù)成員是在程序編譯時(shí)被分配空間的,到程序結(jié)束時(shí)才釋放空間,1:函數(shù)的類型分為:有參有返,有參無(wú)返,無(wú)參有返,無(wú)參無(wú)返成員函數(shù)被重載的特征: 同一個(gè)類中(1)相同的范圍(在同一個(gè)類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual關(guān)鍵字可有可無(wú)。覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是: 運(yùn)行時(shí)的多態(tài)性,一個(gè)類中只有一份同名的方法,沒有保留基類同名的方法(1)不同的范圍(分別位

21、于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual關(guān)鍵字?!半[藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù), 隱藏可以說(shuō)是基類和派生類之間方法的重載,不同類之間規(guī)則如下: /不同類中有相同的方法,保留了基類同名的方法(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關(guān)鍵字。(這里與覆蓋唯一區(qū)別是在于有沒有virtual) 此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆)。如下示例程序中:(1)函數(shù)D

22、erived:f(float)覆蓋了Base:f(float)。(2)函數(shù)Derived:g(int)隱藏了Base:g(float),而不是重載。(3)函數(shù)Derived:h(float)隱藏了Base:h(float),而不是覆蓋。(1) 重載 overload 是根據(jù)函數(shù)的參數(shù)列表來(lái)選擇要調(diào)用的函數(shù)版本,而多態(tài)是根據(jù)運(yùn)行時(shí)對(duì)象的實(shí)際類型來(lái)選擇要調(diào)用的虛函數(shù)版本,多態(tài)的實(shí)現(xiàn)是通過派生類對(duì)基類的虛函數(shù)進(jìn)行覆蓋(override) 來(lái)實(shí)現(xiàn)的,若派生類沒有對(duì)基類的虛函數(shù)進(jìn)行覆蓋 override 的話,則派生類會(huì)自動(dòng)繼承基類的虛函數(shù)版本,此時(shí)無(wú)論基類指針指向的對(duì)象是基類型還是派生類型,都會(huì)調(diào)用基

23、類版本的虛函數(shù);如果派生類對(duì)基類的虛函數(shù)進(jìn)行覆蓋 override 的話,則會(huì)在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類型來(lái)選擇要調(diào)用的虛函數(shù)版本,例如基類指針指向的對(duì)象類型為派生類型,則會(huì)調(diào)用派生類的虛函數(shù)版本,從而實(shí)現(xiàn)多態(tài)。這可以說(shuō)是多態(tài)與覆蓋之間的的關(guān)系了。(2)使用多態(tài)的本意是要我們?cè)诨愔新暶骱瘮?shù)為 virtual ,并且是要在派生類中覆蓋 override 基類的虛函數(shù)版本,注意,此時(shí)的函數(shù)原型與基類保持一致,即同名同參數(shù)類型;如果你在派生類中新添加函數(shù)版本,你不能通過基類指針動(dòng)態(tài)調(diào)用派生類的新的函數(shù)版本,這個(gè)新的函數(shù)版本只作為派生類的一個(gè)重載版本。重載只有在當(dāng)前類中有效。 (3)重載是靜態(tài)聯(lián)編的,

24、多態(tài)是動(dòng)態(tài)聯(lián)編的。進(jìn)一步解釋,重載與指針實(shí)際指向的對(duì)象類型無(wú)關(guān),多態(tài)與指針實(shí)際指向的對(duì)象類型相關(guān)。若基類的指針調(diào)用派生類的重載版本, C+ 編繹認(rèn)為是非法的, C+ 編繹器只認(rèn)為基類指針只能調(diào)用基類的重載版本,重載只在當(dāng)前類的名字空間作用域內(nèi)有效,繼承會(huì)失去重載的特性,當(dāng)然,若此時(shí)的基類指針調(diào)用的是一個(gè)虛函數(shù),那么它還會(huì)進(jìn)行動(dòng)態(tài)選擇基類的虛函數(shù)版本還是派生類的虛函數(shù)版本來(lái)進(jìn)行具體的操作,這是通過基類指針實(shí)際指向的對(duì)象類型來(lái)做決定的,所以說(shuō)重載與指針實(shí)際指向的對(duì)象類型無(wú)關(guān),多態(tài)與指針實(shí)際指向的對(duì)象類型相關(guān)。 (4) 虛函數(shù)同樣可以進(jìn)行重載,但是重載只能是在當(dāng)前自己名字空間作用域內(nèi)有效。C+常用輸

25、出格式控制 eg:void main(void) int count=432; int state=1234; float x=555.55; cout<<“count=“<<dec<<count<<endl; cout<<“state=“<<hex<<state<<endl; cout.setf(ios:scientific); cout<<“x=“<<x<<endl;eg:void main(void) const double PI=3.1415926535

26、89793; cout<<“PI=“<<setprecision(10)<<PI<<endl; int k; cin>>oct>>k; cout<<“k=“<<hex<<k<<endl; float d=324.567; cout<<“d=“<<setw(10)<<setprecision(5) <<setfill(*)<<dec<<d<<endl;其他用法,請(qǐng)百度,或者看C+教學(xué)課件 先給出

27、通過字符型指針輸出字符串的示例代碼,如下:#include <iostream>using std:cout;using std:endl; int main() const char *pszStr = "this is a string" / 輸出字符串 cout << "字符串:" << pszStr << endl; / 顯然不會(huì)輸出地址值 cout << "字符串起始地址值: " << pszStr << endl; return 0;對(duì)于要

28、使用cout輸出字符串指針地址值,我們可能會(huì)產(chǎn)生困惑。曾經(jīng)我們使用C標(biāo)準(zhǔn)庫(kù)中的printf函數(shù)是如此的方便:#include <stdio.h> int main() const char *pszStr = "this is a string" / 輸出字符串 printf("字符串:%sn", pszStr); / 輸出地址值 printf("字符串起始地址值:%pn", pszStr); return 0;兄弟,醒醒吧,咱們要寫的是C+代碼,不要總是抓著C不放嘛。好了,我們來(lái)分析一下,由于C+標(biāo)準(zhǔn)庫(kù)中I/O類對(duì)<

29、;<操作符重載,因此在遇到字符型指針時(shí)會(huì)將其當(dāng)作字符串名來(lái)處理,輸出指針?biāo)傅淖址<热贿@樣,那么我們就別讓它知道那是字符型指針,所以得用到強(qiáng)制類型轉(zhuǎn)換,不過不是C的那套,我們得用static_cast來(lái)實(shí)現(xiàn),把字符串指針轉(zhuǎn)換成無(wú)類型指針,這樣更規(guī)范,如下:#include <iostream>using std:cout;using std:endl; int main() const char *pszStr = "this is a string" / 輸出字符串 cout << "字符串:" << ps

30、zStr << endl; / 如我們所愿,輸出地址值 cout << "字符串起始地址值: " << static_cast<const void *>(pszStr) << endl; return 0;正如我的ping程序一樣,當(dāng)我的電腦也使用手機(jī)wifi上網(wǎng)時(shí),(利用無(wú)線網(wǎng)卡,而不是有線網(wǎng)卡) ,我們windows下的tracert命令也無(wú)法起到解析路由的功能。 估計(jì)我們的ping程序和電腦的ping都是將套接字綁定到有線網(wǎng)卡對(duì)應(yīng)的接口上了,所以如此#setw(+10)的作用和setw(-10)的作用總能猜

31、出來(lái)吧#上述的例子中,有以8進(jìn)制的格式進(jìn)行輸入,而以16進(jìn)制的格式輸出,默認(rèn)是10進(jìn)制的。c中的printf和c+中的cout完成的功能一樣,只是輸出書寫格式不一樣1.格式不同int a=6; cout<<a<<endl; printf("%dn",a)2.printf需要你告訴它格式(int %d, double %f,char %c)cout不需要另外1.printf是函數(shù)。cout是ostream對(duì)象,和<<配合使用。2.printf是變參函數(shù),沒有類型檢查,不安全。cout是通過運(yùn)算符重載實(shí)現(xiàn)的,安全。3.如果printf碰到不認(rèn)

32、識(shí)的類型就沒辦法了,而cout可以自己重載進(jìn)行擴(kuò)展。4.有時(shí)候printf比cout靈活。c+中也能使用printf,但是c中不能使用cout也可以這么說(shuō):c+可以完全兼容c的用法,反過來(lái)就不行C/C+文件操作ifstream用于文件的讀;ofstream用于文件的寫;文件的輸出操作       想要程序中的數(shù)據(jù)輸出到文件中,一共需要以下5個(gè)步驟: 包含fstream頭文件:#include <fstream> 建立ofstream對(duì)象:ofstream ocout; 將對(duì)象與文件關(guān)聯(lián):oco

33、ut.open(“test.txt”); 使用該對(duì)象將數(shù)據(jù)輸出到文件test中:ocout<<”Hello,C+!”; 關(guān)閉與文件的連接:ocout.close();      p.s. 在這里我們應(yīng)用ofstream的對(duì)象ocout將數(shù)據(jù)直接輸出到了文件中,而不是屏幕上!完整程序示例:#include <fstream>using namespace std; int main()    ofstream ocout;&

34、#160;   ocout.open("test.txt");    ocout<<"Hello,C+!"    ocout.close();    return 0;特別注意的是,我們也可以把上面程序的第6和第7行合并為一句話:ofstream ocout("test.txt");這句話的意思就是調(diào)用ofstream類中的構(gòu)造函數(shù)來(lái)創(chuàng)建這個(gè)文本文件。另外,我們需要

35、特別注意一點(diǎn),在完成對(duì)整個(gè)文件的操作之后,一定要用close()函數(shù)將這個(gè)文件關(guān)閉了,否則在程序結(jié)束后,所操作的文件將什么都不會(huì)保存下來(lái)! 不知道是不是和緩沖型文件系統(tǒng)和非緩沖型文件系統(tǒng)的性質(zhì)有關(guān)。讀取文件中的數(shù)據(jù)       打開文件讀取數(shù)據(jù)的方法和輸出數(shù)據(jù)到文集中的方法基本上是一樣的,同樣也需要5個(gè)步驟: 包含fstream頭文件:#include <fstream> 建立ifstream對(duì)象:ifstream icin; 將對(duì)象與文件關(guān)聯(lián):icin.open(“test.txt

36、”); 使用該對(duì)象讀取文件test中的數(shù)據(jù)到數(shù)組temp中:icin>>temp; 關(guān)閉與文件的連接:icin.close();       p.s同上面一樣,我們也可以將第2步和第3步合并成一句話:ifstream icin("test.txt");      它的作用就是調(diào)用ifstream類中的構(gòu)造函數(shù)來(lái)讀取這個(gè)本地的文本文件。#include <fstream>#include <iostream>us

37、ing namespace std; int main()    ifstream icin;    icin.open("test.txt");    char temp100;/定義一個(gè)字符數(shù)組temp    icin>>temp;/將文件中的數(shù)據(jù)讀到字符數(shù)組temp中    cout<<temp&l

38、t;<endl;/將temp中存放的內(nèi)容輸出到屏幕上    return 0;如何讀取空格和空格后面的字符       我們?cè)趯懳募臅r(shí)候,空格是不可避免的。但是由于C+的插入操作符有一個(gè)毛病,它只要一遇到空字符便會(huì)停止輸出。這里的空字符就是空格,或者是0。那么這樣一來(lái),如果我們?cè)谖募杏锌崭褡址敲纯崭窈竺娴淖址蜔o(wú)法被輸出到屏幕上了。比如說(shuō),我們建立的test.txt文件中的內(nèi)容為:Hello C+!即把Hello后面的逗號(hào)改成空格,那么重新運(yùn)行該程序,輸出如下:那么有沒有

39、什么解決方法呢,當(dāng)然是有的哈。用getline()函數(shù)嘛。好了,有了這個(gè)函數(shù),我們就可以把上面的程序中的第10行改成:icin.getline(temp,100);這就表示把字符數(shù)組temp中的內(nèi)容全部讀取到屏幕上,如下圖所示 OK這樣一來(lái),我們就不怕文件中有空格了。 另外,如果我們想要在命令行中寫一段話,而且這段換中包含了空格和回車,那么我們就應(yīng)該利用上面getline()函數(shù)的第三個(gè)參數(shù),因?yàn)橐欢卧捴杏锌赡軙?huì)有回車的出現(xiàn),我們就必須利用getline()的第三個(gè)函數(shù)將默認(rèn)的結(jié)束符號(hào)n換成空字符0。這是由于空字符的ASCII碼為0,我們不可能在文件中輸入空字符,因此這個(gè)時(shí)候,getline(

40、)函數(shù)會(huì)一直讀取到文件的末尾才會(huì)結(jié)束。而如何停止用戶輸入呢?方法其實(shí)很簡(jiǎn)單,在我們輸入完一段話之后,肯定會(huì)按下回車。之后我們就應(yīng)該向該函數(shù)發(fā)出EOF標(biāo)志,即文件結(jié)束符標(biāo)志(End Of File)。在命令行里面發(fā)送文件結(jié)束符的方法是“Ctrl+Z”,之后再次按下回車鍵就能停止輸入了。 p.s. 空格不是空字符,它的ASCII碼為32。 下面,咱們用一個(gè)實(shí)際的例子來(lái)演示一下:首先讀取一段話,然后將其輸出到文件中: #include <iostream>#include <fstream>using namespace std; int main() const int n

41、um=255; char temp1num=0;/初始化數(shù)組temp1 char temp2num=0;/初始化數(shù)組temp2 / 輸出數(shù)據(jù)到文件text.txt中 ofstream f_out("text.txt"); /文件的輸出流對(duì)象 f_out cout<<"請(qǐng)輸入文本的內(nèi)容:n" cin.getline(temp1,num,0); f_out<<temp1; f_out.close(); / 將文件text.txt中的內(nèi)容重新讀回屏幕上 ifstream f_in("text.txt"); /文件的輸

42、入流對(duì)象 f_in f_in.getline(temp2,num,0); cout<<temp2<<endl; return 0;對(duì)整個(gè)程序的分析: 輸出數(shù)據(jù)到文件text.txt中 首先我們?cè)诘?1行定義了一個(gè)文件的輸出流對(duì)象f_out,并用該對(duì)象創(chuàng)建了一個(gè)text.txt文本文件。之后在程序的第13行采用getline()函數(shù)接受文本內(nèi)容,并將其放到temp1字符數(shù)組中。注意,這里的getline()函數(shù)的第三個(gè)參數(shù)為空字符,說(shuō)明它可以接受空格,并且只有達(dá)到文件的末尾才能停止讀取用戶的鍵盤輸入。好了,如果我們輸入完文件之后按下Ctrl+Z,那么接著再次按下Enter

43、回車鍵就會(huì)停止輸入。之后在程序的第14行,我們用ofstream的對(duì)象fout將緩沖區(qū)中的內(nèi)容輸出到文本文件text.txt中。最后關(guān)閉這個(gè)文件。 將文件text.txt中的內(nèi)容重新讀回屏幕上 同輸出一樣,首先我們?cè)诔绦虻牡?7行定義了一個(gè)文件的輸入流對(duì)象f_in,并用該對(duì)象讀取了剛剛創(chuàng)建的text.txt文本文件。之后又調(diào)用getlin()函數(shù)將文件中的內(nèi)容輸出到了字符數(shù)組temp2中,之后運(yùn)用cout來(lái)輸出temp2數(shù)組的內(nèi)容到屏幕上。這樣一來(lái),我們就完成了對(duì)文件的輸入輸出操作。 其運(yùn)行的結(jié)果如下: OK啦!程序輸出成功咯!但是這個(gè)程序還有一個(gè)小小的瑕疵,注意看上面輸出結(jié)果,我們可以看到在

44、命令行中“請(qǐng)按任意鍵繼續(xù)”上面居然還有一個(gè)回車!這是怎么回事呢?我們并沒有在多輸出一個(gè)回車??? 其實(shí)是有的!注意,我們?cè)凇?!”之后回了一次車,然后才輸出了ctrl+Z,向getline()函數(shù)發(fā)送了一個(gè)文件結(jié)束的標(biāo)志。之后為了讓程序結(jié)束,又按了一下回車。那么這里面第2次按下的回車由于超出了文件結(jié)束符EOF被自動(dòng)拋棄了,但是,第一次按下的回車,就是!之后的那個(gè)回車卻沒有被丟棄掉,而是被寫入了temp1函數(shù)中。這個(gè)就是問題的所在。所以我們?cè)谳敵鲋?,?huì)看到在“請(qǐng)按任意鍵繼續(xù)”上面居然還有一個(gè)回車!對(duì)于這個(gè)問題,解決方法其實(shí)很簡(jiǎn)單,我們只需要把最后一個(gè)Enter改成空字符0就可以了。即在程序的13行

45、之后添加上這樣兩句話:int n=strlen(temp1);temp1n-1='0' 第一句話的意思就是讀取字符數(shù)組temp1中可見字符的長(zhǎng)度,并保存到整型變量n中;第二句話的意思就是找到保存Enter鍵的元素的下標(biāo),然后將這個(gè)下標(biāo)的元素賦值成空字符就可以了。完整的程序如下:#include <iostream>#include <fstream>using namespace std; int main() const int num=255; char temp1num=0;/初始化數(shù)組temp1 char temp2num=0;/初始化數(shù)組tem

46、p2 / 輸出數(shù)據(jù)到文件text.txt中 ofstream f_out("text.txt"); cout<<"請(qǐng)輸入文本的內(nèi)容:n" cin.getline(temp1,num,0); int n=strlen(temp1); temp1n-1='0' f_out<<temp1; f_out.close(); / 將文件text.txt中的內(nèi)容重新讀回屏幕上 ifstream f_in("text.txt"); f_in.getline(temp2,num,0); cout<<t

47、emp2<<endl; return 0;然后是程序的輸出: 好了,終于把這個(gè)程序搞定了,好麻煩!呼呼當(dāng)我們想要打開的文件不存在的時(shí)候,一般地,ofstream類的對(duì)象會(huì)默認(rèn)地自動(dòng)創(chuàng)建一個(gè)文件。而如果我們想要打開的文件是存在的,那么就會(huì)調(diào)用ofstream的構(gòu)造函數(shù)或者是調(diào)用open()函數(shù)進(jìn)行打開??磥?lái)ifstream類的對(duì)象如果沒有該文件,并不會(huì)自動(dòng)創(chuàng)文件綜合操作說(shuō)明提問:如果你想運(yùn)用文件,你知道文件處理的步驟嗎? 請(qǐng)結(jié)合生活實(shí)際進(jìn)行解答:提問:讀寫文件函數(shù)分為四類,他們分別是?答: 以字符形式進(jìn)行讀寫文件操作,請(qǐng)寫出對(duì)應(yīng)函數(shù)名? 以字符串形式進(jìn)行讀寫文件操作,請(qǐng)寫出對(duì)應(yīng)函數(shù)名

48、? 以格式化形式進(jìn)行讀寫文件操作,請(qǐng)寫出對(duì)應(yīng)函數(shù)名? 以數(shù)據(jù)塊形式進(jìn)行讀寫文件操作,請(qǐng)寫出對(duì)應(yīng)函數(shù)名?文件函數(shù)說(shuō)明(重) 執(zhí)行fopen()函數(shù),計(jì)算機(jī)完成以下操作: 1:在磁盤中找到指定文件 2:在內(nèi)存中分配保存一個(gè)FILE類型結(jié)構(gòu)的單元(16B) 3:在內(nèi)存中分配文件緩沖區(qū)單元(512B) 4:返回FILE結(jié)構(gòu)地址 C語(yǔ)言不允許打開的文件又打開一次與fopen()和fclose()函數(shù)對(duì)應(yīng)的exit(0)函數(shù)起到關(guān)閉所有打開的文件,推出程序的雙重功效。參數(shù)0表示程序正常結(jié)束,非0參數(shù)表示程序非正常結(jié)束。提問: 執(zhí)行文件關(guān)閉函數(shù)后,文件被關(guān)閉了,那發(fā)生了什么狀況?ch=fputc(fp);知道這是什么意思嗎?fputc(ch,fp);說(shuō)明了fputc()函數(shù)是怎么運(yùn)作的?該函數(shù)具有返回值,寫入文件成功則返回對(duì)應(yīng)的字符ch,失敗則返回EOFfeof()函數(shù)你知道是什么意思嗎? eof=End Of File 表示檢測(cè)是否讀到文件尾部(file文件類型指針指向的文件對(duì)象中必定有一個(gè)數(shù)據(jù)成員是用來(lái)指向其數(shù)據(jù)域所存放的數(shù)據(jù)信息的,當(dāng)調(diào)用fopen()函數(shù)后,文件對(duì)象中某一數(shù)據(jù)成員便指向數(shù)據(jù)域的起始地址,當(dāng)你用fputc()或者fgets()函數(shù)后,這個(gè)指針的位置便會(huì)根據(jù)需

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論