C++是一種高效實用的程序設(shè)計語言,它既可進(jìn)行過程化程序設(shè)計,也可進(jìn)行面向?qū)ο蟪绦蛟O(shè)計,因而成為編程人員最廣泛使用的工具。學(xué)好C++,很容易觸類旁通其他軟件,C++架起了通向強(qiáng)大、易用、真正的軟件開發(fā)應(yīng)用的橋梁。許多高等院校已經(jīng)開設(shè)了C++程序設(shè)計語言課,急需一本實用的教材。本書是作者總結(jié)兩年教學(xué)實踐的經(jīng)驗寫成的,適合用作大學(xué)計算機(jī)專業(yè)和非計算機(jī)專業(yè)的程序設(shè)計基礎(chǔ)課程教材,也可供自學(xué)的讀者使用。
本書共分兩大部分。第一部分,第1章至第10章是基礎(chǔ)部分,主要介紹C++程序設(shè)計語言、程序結(jié)構(gòu)和過程化基礎(chǔ)。第二部分,第11章至第21章,是面向?qū)ο蟪绦蛟O(shè)計部分,它建立在C++程序設(shè)計基礎(chǔ)之上,講述了面向?qū)ο蟪绦蛟O(shè)計方法。
前言
C++是一門高效實用的程序設(shè)計語言,它既可進(jìn)行過程化程序設(shè)計,也可進(jìn)行面向?qū)ο蟪绦蛟O(shè)計。C++語言強(qiáng)調(diào)對高級抽象的支持。C++實現(xiàn)了類的封裝、數(shù)據(jù)隱藏、繼承及多態(tài),使得其代碼容易維護(hù)及高度可重用。隨著C++漸漸成為ANSI標(biāo)準(zhǔn),這種新的面向?qū)ο蟪绦蛟O(shè)計語言迅速成為程序員最廣泛使用的工具。幾乎在所有計算機(jī)研究和應(yīng)用領(lǐng)域,都能看到C++的影子。
C++從C進(jìn)化而來,是C語言的超集。C++在程序結(jié)構(gòu)的本質(zhì)上與C是一致的,都是用函數(shù)驅(qū)動機(jī)制實現(xiàn)。學(xué)過C語言,再來看C++,就會感到C++更簡單和容易理解。過程化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計之間并無水火不容的矛盾,面向?qū)ο蟪绦蛟O(shè)計是過程化程序設(shè)計的自然升華。
本書對于學(xué)過或沒有學(xué)過C語言的讀者都是適用的。如果學(xué)過ANSI C,則可以跳過第一部分的程序設(shè)計基礎(chǔ),直接閱讀第二部分。在學(xué)習(xí)第二部分時,遇到某些概念不清之處,可以根據(jù)章節(jié)目錄查閱第一部分的有關(guān)內(nèi)容。本書配備有《C++習(xí)題解答》,這對自學(xué)者尤為方便。
本書適合做大學(xué)計算機(jī)專業(yè)和非計算機(jī)專業(yè)的程序設(shè)計基礎(chǔ)課程教材。通過本書可達(dá)到以下三個培養(yǎng)目標(biāo):
1. 程序設(shè)計入門,領(lǐng)略什么是面向?qū)ο蟪绦蛟O(shè)計;
2. 掌握程序設(shè)計方法,領(lǐng)會面向?qū)ο蟪绦蛟O(shè)計;
3. 把握C++程序設(shè)計的靈魂,掌握面向?qū)ο蟪绦蛟O(shè)計的方法。
縱觀當(dāng)前,C++的發(fā)展領(lǐng)導(dǎo)了程序設(shè)計語言的潮流,大有取代其他程序語言之趨勢。在教學(xué)上,它以其面向?qū)ο蟮奶卣骱蛧?yán)密的類型系統(tǒng)而正在悄無聲息地取代Pascal; 在科學(xué)計算功能上,它比Fortran更為可靠和方便; 在系統(tǒng)軟件的研究開發(fā)上,它又是上選的語種; 在小規(guī)模控制應(yīng)用上,C++的效率比之C毫不遜色; 在大規(guī)模應(yīng)用軟件開發(fā)上,以Windows環(huán)境為代表的C++類庫以及組件(組合類庫)在迅速發(fā)展,它的觸角觸及各個領(lǐng)域。
C++編譯器以Borland C++和Visual C++為典型,其版本在激烈的競爭中快速更新。那些老版本,如Microsoft C和Tubor C已經(jīng)很少為人所用。即使學(xué)習(xí)C語言的人們目前也多在C++的編譯環(huán)境中上機(jī)操作與調(diào)試。計算機(jī)等級考試的程序設(shè)計要求也在補(bǔ)充和更新。這就是C++不久即將取代C的無可抗拒的趨勢與事實。C++作為程序設(shè)計基礎(chǔ)教學(xué)也將以強(qiáng)有力的態(tài)勢迅速取代C語言。
C++程序的集成開發(fā)器如Borland C++和Visual C++(2.0以下版),作為軟件開發(fā)工具,已經(jīng)不再時髦。Borland C++將不再有新版本,Borland公司的C++Builder將取代現(xiàn)在的Borland C++,就像當(dāng)初Borland C++取代Tubor C一樣。軟件開發(fā)進(jìn)入了可視化程序開發(fā)環(huán)境的時代。
一方面是陳舊的軟件開發(fā)工具在淘汰,另一方面是新的軟件開發(fā)工具在崛起。作者竭力推崇新的軟件開發(fā)工具BC++Builder 4.0和Visual C++6.0,因為它們不但是優(yōu)秀的可視化開發(fā)工具,而且由于它們是基于C++的,可以充分發(fā)揮C++語言強(qiáng)大靈活的特點(diǎn),用面向?qū)ο蟪绦蛟O(shè)計方法去閱讀、理解、思考和分析、設(shè)計以及編程。
學(xué)好C++,很容易觸類旁通其他軟件,如基于Java語言的Visual J++和J++Builder,而且像ActiveX SDK和DirectX SDK等都是C++形式的。C++架起了通向強(qiáng)大、易用、真正的軟件開發(fā)應(yīng)用的橋梁。計算機(jī)發(fā)展到今天,培養(yǎng)一個具有相當(dāng)?shù)膽?yīng)用軟件開發(fā)能力的人才,已經(jīng)不需要很長的周期了。這給每個人都帶來了最好的機(jī)遇和最大的挑戰(zhàn)。我們的戰(zhàn)略是,大學(xué)一年級學(xué)習(xí)C++課程,大學(xué)二年級,在適當(dāng)?shù)闹笇?dǎo)下就可學(xué)習(xí)如C++Builder和Visual C++這些快速應(yīng)用程序開發(fā)工具了。這意味著計算機(jī)專業(yè)的學(xué)生,大學(xué)二年級就可以沖向計算機(jī)應(yīng)用的前沿,以此與計算機(jī)其他課程的學(xué)習(xí)相輔相成。非計算機(jī)專業(yè)的學(xué)生,同樣也可以在應(yīng)用開發(fā)的實踐中找到自己的位置。
學(xué)程序設(shè)計,不僅要在運(yùn)用程序設(shè)計的思想上獲得一個大的突破,也應(yīng)在運(yùn)用程序設(shè)計的開發(fā)工具上走向真正的實用。這才是真正的理論聯(lián)系實際,而且是事半功倍的學(xué)習(xí)方法。
本書分為兩大部分。第一部分,第1章至第10章,是基礎(chǔ)部分,主要介紹C++程序設(shè)計語言,程序結(jié)構(gòu)和過程化基礎(chǔ)。第二部分,第11章至第21章,是面向?qū)ο蟪绦蛟O(shè)計部分,它建立在C++程序設(shè)計基礎(chǔ)之上,講述了面向?qū)ο蟪绦蛟O(shè)計的方法。
本書內(nèi)容特點(diǎn)
1. 強(qiáng)化重要概念函數(shù): 函數(shù)是理解C/C++語言的重要基礎(chǔ)。在書中作了較多的描述。
程序結(jié)構(gòu): 程序結(jié)構(gòu)的理解與實踐是從C++語言的學(xué)習(xí)跨向?qū)嶋H應(yīng)用的關(guān)鍵。作者在這方面也注入了較多的筆墨。
指針: 指針是理解各種C++語言現(xiàn)象的關(guān)鍵,透過指針能夠更好地理解語言的表達(dá)和程序的工作。這本書對指針重點(diǎn)展開介紹。
鏈表: 鏈表是數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),也是軟件設(shè)計的重要技術(shù)。作者強(qiáng)調(diào)鏈表實現(xiàn)技術(shù),是想從根本上讓讀者領(lǐng)會程序設(shè)計的技術(shù)性和藝術(shù)性。
引用: 引用是C++特有的,C++面向?qū)ο蟮某绦蚰軌虮蝗碎喿x理解,引用起了很大的作用。本書專辟一章講述。
類: 類是面向?qū)ο蟪绦蛟O(shè)計的首要概念。書中從第11章起,不停地描述類類型機(jī)制和面向?qū)ο蟪绦蛟O(shè)計的各項內(nèi)容。
繼承與虛函數(shù): 繼承與虛函數(shù)是C++實現(xiàn)類的多態(tài)性的機(jī)制。它因而也是面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵之一。理解繼承與虛函數(shù)能使讀者從整體上把握面向?qū)ο蟪绦蛟O(shè)計的方法,從而走向真正的實用。
2. 舍棄次要內(nèi)容
聯(lián)合與位域: 本書只介紹結(jié)構(gòu)而不介紹聯(lián)合和位域,是考慮到這些內(nèi)容相對整個程序設(shè)計的功能來說已經(jīng)退化。
多級指針: 書中只介紹多級指針的概念(多維數(shù)組也如此),而不具體展開。
考慮到篇幅不講成員指針: 在《C++習(xí)題解答》中,有對成員指針的介紹,作為本書的補(bǔ)充。
3. 不求面面俱到,但求通俗易懂
本書不是語法參考書,是自成體系的C++教科書。它的目的是讓讀者通過自學(xué)或在老師講授下,能夠運(yùn)用C++語言的基本要素,進(jìn)行基本的結(jié)構(gòu)化程序設(shè)計和面向?qū)ο蟮某绦蛟O(shè)計。因此全書緊緊圍繞著如何進(jìn)行程序設(shè)計而展開。前半部分,講述C++程序設(shè)計基礎(chǔ),在此基礎(chǔ)之上,后半部分,介紹面向?qū)ο蟪绦蛟O(shè)計的具體方法。
4. 以C作為背景
本書講述的內(nèi)容以ANSI C++為標(biāo)準(zhǔn)。書中出現(xiàn)的C內(nèi)容是C++的參照。如關(guān)于C庫函數(shù)printf和scanf,出現(xiàn)在與C++流作比較的場合,庫函數(shù)malloc和free出現(xiàn)在與C++的new和delete作比較的場合。另外,還有C中的結(jié)構(gòu)與C++中的結(jié)構(gòu)之差異,C中的函數(shù)名與C++中的函數(shù)名之差異等。
考慮到準(zhǔn)備參加C語言等級考試的讀者,我們在書中對C的數(shù)學(xué)和字符串操作庫函數(shù)作了適當(dāng)?shù)慕榻B。
本書編排特點(diǎn)
每章首均引出本章將要講述的內(nèi)容和學(xué)習(xí)要求。
在每章結(jié)束時,都做了小結(jié),給出本章內(nèi)容的概括性描述,指出本章在全書中的重要程度,并且指導(dǎo)學(xué)生進(jìn)一步學(xué)習(xí)有關(guān)內(nèi)容。
每章末安排的習(xí)題都是操作性習(xí)題,能通過上機(jī)加以驗證。
書中遇有在理解上特別重要的內(nèi)容用黑體標(biāo)記。
與本書章節(jié)內(nèi)容緊密聯(lián)系的一些概念和說明用→引導(dǎo),另起編段。
本書的各章與《C++習(xí)題解答》中的各章一一對應(yīng)。教程中沒有寫進(jìn)去的內(nèi)容有些在習(xí)題解答中得到了補(bǔ)充。教程中的習(xí)題有些在習(xí)題解答中有類似的題解。
本書強(qiáng)調(diào)程序的可讀性。使用統(tǒng)一的程序設(shè)計風(fēng)格,并希望讀者自始至終地模仿。
本書強(qiáng)調(diào)程序的可移植性。不以某個C++編譯器為標(biāo)準(zhǔn),而以最新的ANSI C++標(biāo)準(zhǔn)為編書標(biāo)準(zhǔn)。程序中的編譯錯誤,一般用Borland C++(簡稱BC)中的出錯信息給出。有些BC中的警告在Visual C++(簡稱VC)中是編譯錯誤或反之,則同時也給出VC的出錯信息。
本書中包含了大量的程序例子,并附有運(yùn)行結(jié)果。凡在程序開頭帶有程序名編號的,都是完整的程序,它們經(jīng)過了上機(jī)調(diào)試,可以直接在計算機(jī)上編譯運(yùn)行。運(yùn)行結(jié)果中,如果是手工鍵入的字符,則用下劃線表示。
本書中所有編號的程序,讀者可到網(wǎng)站http://www.tup.com.cn上下載。
大學(xué)C++程序設(shè)計基礎(chǔ)教學(xué)尚在起步,教學(xué)方法、手段和形式還在摸索中。本教材難免有不足之處,我們誠懇期待讀者的批評指正和建議,以供再版時參考,使本書日臻完善。作者的電子郵件地址: qianneng@mail.hz.zj.cn
通信地址: 杭州市德勝新村12幢1單元101室(郵編310014)
目錄
第一部分C++過程化語言基礎(chǔ)
第1章C++入門
1.1從C到C++
1.2程序與語言
1.3結(jié)構(gòu)化程序設(shè)計
1.4面向?qū)ο蟪绦蛟O(shè)計
1.5程序開發(fā)過程
1.6最簡單的程序
1.7函數(shù)
小結(jié)
第2章基本數(shù)據(jù)類型與輸入輸出
2.1字符集與保留字
2.2基本數(shù)據(jù)類型
2.3變量定義
2.4字面量
2.5常量
2.6I/O流控制
2.7printf與scanf
小結(jié)
練習(xí)
第3章表達(dá)式和語句
3.1表達(dá)式
3.2算術(shù)運(yùn)算和賦值
3.3算術(shù)類型轉(zhuǎn)換
3.4增量和減量
3.5關(guān)系與邏輯運(yùn)算
3.6if語句
3.7條件運(yùn)算符
3.8逗號表達(dá)式
3.9求值次序與副作用
小結(jié)
練習(xí)
第4章過程化語句
4.1while語句
4.2do...while語句
4.3for語句
4.4switch語句
4.5轉(zhuǎn)向語句
4.6過程應(yīng)用: 求π
4.7過程應(yīng)用: 判明素數(shù)
4.8過程應(yīng)用: 求積分
小結(jié)
練習(xí)
第5章函數(shù)
5.1函數(shù)概述
5.2函數(shù)原型
5.3全局變量與局部變量
5.4函數(shù)調(diào)用機(jī)制
5.5靜態(tài)局部變量
5.6遞歸函數(shù)
5.7內(nèi)聯(lián)函數(shù)
5.8重載函數(shù)
5.9默認(rèn)參數(shù)的函數(shù)
小結(jié)
練習(xí)
第6章程序結(jié)構(gòu)
6.1外部存儲類型
6.2靜態(tài)存儲類型
6.3作用域
6.4可見性
6.5生命期
6.6頭文件
6.7多文件結(jié)構(gòu)
6.8編譯預(yù)處理
小結(jié)
練習(xí)第7章數(shù)組
7.1數(shù)組定義
7.2訪問數(shù)組元素
7.3初始化數(shù)組
7.4向函數(shù)傳遞數(shù)組
7.5二維數(shù)組
7.6數(shù)組應(yīng)用: 排序
7.7數(shù)組應(yīng)用: Josephus問題
7.8數(shù)組應(yīng)用: 矩陣乘法
小結(jié)
練習(xí)
第8章指針
8.1指針概念
8.2指針運(yùn)算
8.3指針與數(shù)組
8.4堆內(nèi)存分配
8.5const指針
8.6指針與函數(shù)
8.7字符指針
8.8指針數(shù)組
8.9命令行參數(shù)
8.10函數(shù)指針
小結(jié)
練習(xí)
第9章引用
9.1引用的概念
9.2引用的操作
9.3什么能被引用
9.4用引用傳遞函數(shù)參數(shù)
9.5返回多個值
9.6用引用返回值
9.7函數(shù)調(diào)用作為左值
9.8用const限定引用
9.9返回堆中變量的引用
小結(jié)
練習(xí)
第10章結(jié)構(gòu)
10.1結(jié)構(gòu)概述
10.2結(jié)構(gòu)與指針
10.3結(jié)構(gòu)與數(shù)組
10.4傳遞結(jié)構(gòu)參數(shù)
10.5返回結(jié)構(gòu)
10.6鏈表結(jié)構(gòu)
10.7創(chuàng)建與遍歷鏈表
10.8刪除鏈表結(jié)點(diǎn)
10.9插入鏈表結(jié)點(diǎn)
10.10結(jié)構(gòu)應(yīng)用: Josephus問題
小結(jié)
練習(xí)
第二部分面向?qū)ο蟪绦蛟O(shè)計
第11章類
11.1從結(jié)構(gòu)到類
11.2軟件方法的發(fā)展必然
11.3定義成員函數(shù)
11.4調(diào)用成員函數(shù)
11.5保護(hù)成員
11.6屏蔽類的內(nèi)部實現(xiàn)
11.7再論程序結(jié)構(gòu)
小結(jié)
練習(xí)
第12章構(gòu)造函數(shù)
12.1類與對象
12.2構(gòu)造函數(shù)的需要性
12.3構(gòu)造函數(shù)的使用
12.4析構(gòu)函數(shù)
12.5帶參數(shù)的構(gòu)造函數(shù)
12.6重載構(gòu)造函數(shù)
12.7默認(rèn)構(gòu)造函數(shù)
12.8類成員初始化的困惑
12.9構(gòu)造類成員
12.10構(gòu)造對象的順序
小結(jié)
練習(xí)
第13章面向?qū)ο蟪绦蛟O(shè)計
13.1抽象
13.2分類
13.3設(shè)計和效率
13.4討論Josephus問題
13.5結(jié)構(gòu)化方法
13.6結(jié)構(gòu)化方法的實現(xiàn)
13.7面向?qū)ο蠓椒?br />13.8面向?qū)ο蠓椒ǖ膶崿F(xiàn)
13.9程序維護(hù)
小結(jié)
練習(xí)
第14章堆與拷貝構(gòu)造函數(shù)
14.1關(guān)于堆
14.2需要new和delete的原因
14.3分配堆對象
14.4拷貝構(gòu)造函數(shù)
14.5默認(rèn)拷貝構(gòu)造函數(shù)
14.6淺拷貝與深拷貝
14.7臨時對象
14.8無名對象
14.9構(gòu)造函數(shù)用于類型轉(zhuǎn)換
小結(jié)
練習(xí)
第15章靜態(tài)成員與友元
15.1靜態(tài)成員的需要性
15.2靜態(tài)成員的使用
15.3靜態(tài)數(shù)據(jù)成員
15.4靜態(tài)成員函數(shù)
15.5需要友元的原因
15.6友元的使用
小結(jié)
練習(xí)
第16章繼承
16.1繼承的概念
16.2繼承的工作方式
16.3派生類的構(gòu)造
16.4繼承與組合
16.5多態(tài)性
16.6多態(tài)的思考方式
16.7多態(tài)性如何工作
16.8不恰當(dāng)?shù)奶摵瘮?shù)
16.9虛函數(shù)的限制
16.10類的冗余
16.11克服冗余帶來的問題
16.12類的分解
16.13抽象類
16.14由抽象類派生具體類
16.15純虛函數(shù)的需要性
小結(jié)
練習(xí)
第17章多重繼承
17.1多繼承如何工作
17.2繼承的模糊性
17.3虛擬繼承
17.4多繼承的構(gòu)造順序
17.5繼承的訪問控制
17.6保護(hù)繼承與私有繼承
小結(jié)
練習(xí)
第18章運(yùn)算符重載
18.1運(yùn)算符重載的需要性
18.2如何重載運(yùn)算符
18.3值返回與引用返回
18.4運(yùn)算符作成員函數(shù)
18.5重載增量運(yùn)算符
18.6轉(zhuǎn)換運(yùn)算符
18.7賦值運(yùn)算符
小結(jié)
練習(xí)第19章I/O流
19.1printf和scanf的缺陷
19.2I/O標(biāo)準(zhǔn)流類
19.3文件流類
19.4串流類
19.5控制符
19.6使用I/O成員函數(shù)
19.7重載插入運(yùn)算符
19.8插入運(yùn)算符與虛函數(shù)
19.9文件操作
小結(jié)
練習(xí)
第20章模板
20.1模板的概念
20.2為什么要用模板
20.3函數(shù)模板
20.4重載模板函數(shù)
20.5類模板的定義
20.6使用類模板
20.7使用標(biāo)準(zhǔn)模板類庫: Josephus問題
小結(jié)
練習(xí)
第21章異常處理
21.1異常的概念
21.2異常的基本思想
21.3異常的實現(xiàn)
21.4異常的規(guī)則
21.5多路捕捉
21.6異常處理機(jī)制
21.7使用異常的方法
小結(jié)
練習(xí)
參考文獻(xiàn)