本書是一本集C++語言高級特性和面向?qū)ο笏枷胗谝簧淼闹屑壖夹g(shù)指南。在涵蓋了C++語言的主要特點(封裝、繼承、多態(tài))之余,從軟件建模的視角出發(fā),引入了針對抽象編程、聚合優(yōu)先于繼承、低耦合、高內(nèi)聚等面向?qū)ο笏枷氲闹v述。此外,對困惑程序員已久的程序依賴問題做了深入分析; 給出了異步消息通信的原理及實現(xiàn); 引入了架構(gòu)分析,對循環(huán)依賴和MVC模式的原理實現(xiàn)及缺陷改良也做了深入論述。本書有別于一般介紹C++語言的書籍,涉及了一些底層原理和編譯知識的挖掘理解; 不同于純粹介紹軟件模式等面向?qū)ο笤O(shè)計方面的書籍,在內(nèi)容設(shè)計上注重由淺入深,實例指導(dǎo); 結(jié)合面向?qū)ο笏枷,對各種軟件基礎(chǔ)模式的原理思想和實現(xiàn)也有介紹。
本書可作為高等院校相關(guān)專業(yè)高年級本科生、研究生的教材,也可作為軟件開發(fā)領(lǐng)域工程師的參考書。
為什么要寫這樣一本C++技術(shù)書籍
本書最開始的想法很簡單,即為定制班的學(xué)生服務(wù)。本書第一作者在IT行業(yè)從業(yè)近十年,是軟通動力信息技術(shù)(集團(tuán))公司的高級系統(tǒng)分析師,同時也是一名高校教師。2010年5月軟通動力公司與筆者所在高校簽訂了C++軟件工程師定制班培養(yǎng)協(xié)議,從那時起,就有了系列教材出版計劃,其中《面向?qū)ο骍ML系統(tǒng)分析建模》于2013年9月已由清華大學(xué)出版社出版。
從實際教學(xué)和工程指導(dǎo)所需來看,為何不能夠集中課時將關(guān)注點集中在C++的中高級特性上,少言甚至濾去有關(guān)輸入輸出、基本語言特性部分; 為何不能將兩類多態(tài)的原理講透徹,讓學(xué)生理解多態(tài)中蘊含的軟件復(fù)用的發(fā)展; 為何不能結(jié)合軟件設(shè)計模式讓學(xué)生理解擁抱變化的內(nèi)涵; 為何不能結(jié)合面向?qū)ο笏枷刖枳寣W(xué)生在初始編程時就養(yǎng)成測試驅(qū)動和MVC分層、針對抽象不針對具象的基本素養(yǎng)?每一個IT人,都有著技術(shù)的狂熱和理想,自己不例外更希望能適當(dāng)總結(jié)一些單純、適用的東西給這些年輕的IT從業(yè)者,希望他們能在商業(yè)項目忙碌之余,手頭上能有一本給予適當(dāng)啟發(fā)的參考書。
自C++語言誕生以來,面向?qū)ο蟪绦蛟O(shè)計成為主流,但C++語言學(xué)習(xí)的高難度使得它在程序員市場在21世紀(jì)初面臨著以Java語言為代表的第二代面向?qū)ο蟪绦蛟O(shè)計語言的強烈競爭。自Visual Basic、Delphi等客戶前端開發(fā)工具出現(xiàn)后,C/C++語言逐步退出桌面端開發(fā)工具市場,而退守深植根于嵌入式和后臺交換控制領(lǐng)域。1998年Java語言誕生,以其前后臺通吃地全面性席卷全球,并迅速迎來Web開發(fā)時代,軟件迎來C/S模式向B/S模式的深刻變革。一時間,在桌面開發(fā)工具市場上,Java的AWT/SWING所向披靡,摧枯拉朽般消滅了Visual Basic、Delphi、PowerBuilder等開發(fā)工具; 在Web開發(fā)工具市場,J2EE的JSP+Servlet的Model2模型迅速成為市場主流壓倒ASP框架。更主要的是,Java語言一改程序員嚴(yán)格的內(nèi)存分配、初始化、釋放自律負(fù)責(zé)的態(tài)度,程序員不再需要關(guān)注內(nèi)存細(xì)節(jié),極大降低了編程難度; Java首創(chuàng)虛擬機即時編譯,使得字節(jié)碼的編譯結(jié)果得以在不同虛擬機平臺上再次動態(tài)編譯執(zhí)行成為可能,從根本上解決了應(yīng)用程序的擴(kuò)OS平臺移植難題——此舉從根本上將程序員繁重的移植任務(wù)交給了Java語言本身,即由JDK的擁有者負(fù)責(zé)不同版本虛擬機的支持解釋。但不論Java如何強勢,在TIOBE編程語言排行榜獨占鰲頭近十年,但在企業(yè)后臺交換市場和一些嚴(yán)格強調(diào)安全性、并發(fā)性、效率性能的行業(yè)市場,C/C++以其專業(yè)性地位牢不可破?v觀20世紀(jì)80年代以來的編程語言市場,C/C++語言該體系遙遙領(lǐng)先于其他編程語言,即便Java語言最強大時期也從未占據(jù)20%以上份額; 最近七八年來,隨著移動互聯(lián)和手游的興起,C++以其杰出的底層控制和語言效率王者歸來,與C語言、Java語言一起牢牢占據(jù)著TIOBE編程語言排行榜的三甲。
在程序員初入行市場薪資水平上,C/C++程序員工資一般高于Java程序員,近年來對C/C++程序員的追逐饑渴熱度直線上升,且與Java程序員工資差距呈現(xiàn)不斷擴(kuò)大趨勢。作為企業(yè)任職的高級系統(tǒng)分析師和高校教師雙重身份的我們,不禁疑惑,究竟是怎么了,那些20世紀(jì)80~90年代大學(xué)生們學(xué)習(xí)C/C++的狂熱都到哪里去了?
問題還是出在Java身上,它把程序員慣壞了: 它讓身為程序員應(yīng)具有的嚴(yán)格、規(guī)范和全局性思維不再。越來越多的人認(rèn)識到,學(xué)生必須掌握基礎(chǔ),必須牢固地理解內(nèi)存和OS機制,而不能什么都交給虛擬機。數(shù)據(jù)結(jié)構(gòu)、算法課程,更應(yīng)植根于C/C++本身特性,而并非各種STL、JDK的教學(xué)上。
另外,Java語言和J2EE框架的流行又極大地普及了設(shè)計模式和軟件建模的應(yīng)用。那么反過來,是否可以將這種模式建構(gòu)系統(tǒng)的觀點應(yīng)用在C++語言中的教學(xué)中,讓從業(yè)者、初學(xué)者能從浩如煙海的C++知識點中汲取到那最寶貴的百分之十面向?qū)ο笏枷?筆者教學(xué)和實施項目之余,常常想著這樣的念頭如何付諸實施。2013年9月,經(jīng)過3年認(rèn)真刪減留下的精簡版的《面向?qū)ο骍ML系統(tǒng)分析建!方K于出版了,該書有別于傳統(tǒng)講述UML和RUP模型的工具書,反而更似一本將建模與設(shè)計模式結(jié)合的技術(shù)專著,得到眾多褒揚之余,也下定決心再寫一本C++與建模結(jié)合的書,讓學(xué)習(xí)C++語言的人能夠感受到面向?qū)ο笾,體驗設(shè)計模式之靈活神奇。
書的主要內(nèi)容有哪些
全書共8章,第1和第2章扼要回顧C語言并介紹C++語言的主要特點(封裝、繼承、多態(tài)),對功能分解和逐步分層求精做了深入闡述,對軟件復(fù)用做了歸納,對容易混淆的變量/函數(shù)聲明、變量/函數(shù)定義做了清晰的區(qū)分,對多文件工程常見的頭文件重復(fù)包含問題給出了原理上的分析和解決方法; 第3章將指針和引用一起做了深入的分析比對; 第4章對類和對象做了全面的闡述(類結(jié)構(gòu)、類的分析識別過程、對象初始化、析構(gòu)); 第5章全面深入地闡述了兩類多態(tài)原理,對函數(shù)間的重載、覆蓋、隱藏關(guān)系做了精確深入的剖析,并引入了針對抽象編程這一關(guān)鍵面向?qū)ο笏枷耄?第6章對類間的4種關(guān)系(繼承、聚合、關(guān)聯(lián)、依賴)做了清晰描述,結(jié)合實例引入了聚合優(yōu)先于繼承以及低耦合高內(nèi)聚等面向?qū)ο笏枷氲闹v述,對困惑C++程序員的程序依賴問題做了深入挖掘分析,最后詳盡闡述了消息通信機制,給出了異步消息通信的原理及實現(xiàn); 第7章對內(nèi)存泄漏、運算符重載、友元、抽象類以及virtual“三虛”做了全面細(xì)致的分析闡述; 第8章對循環(huán)依賴問題、架構(gòu)分析以及MVC原理實現(xiàn)與缺陷改良做了深入論述,最后引入了一個綜合應(yīng)用了針對抽象編程、依賴倒置、聚合優(yōu)先于繼承等面向?qū)ο笏枷氲膶嵗?/span>
誰需要本書
學(xué)習(xí)和了解了一些C++語言特性,但卻始終無法真正邁進(jìn)面向?qū)ο蟠箝T的程序員可能需要本書; 絕大多數(shù)在面向?qū)ο箢I(lǐng)域里刻苦攻讀、努力實踐、卻遲遲不能看到美好回報的程序員可能需要本書; 一些準(zhǔn)備學(xué)習(xí)設(shè)計模式、UML軟件建模、軟件重構(gòu)和軟件體系結(jié)構(gòu)知識的中高級軟件工程師可能需要本書。
分工與答謝
筆者都是從業(yè)IT多年的軟件工程師、項目經(jīng)理或高校教師。孫寶林、崔洪芳和曾長軍負(fù)責(zé)編寫第1章; 桂超、胡漢武和李祥負(fù)責(zé)編寫第2章; 關(guān)培超、劉坤和鄧沌華負(fù)責(zé)編寫第3章; 包瓊、陳婕和尤川川負(fù)責(zé)編寫第7章; 劉鵬遠(yuǎn)和溫玨負(fù)責(zé)其余章節(jié)的編寫及全書統(tǒng)稿。
在本書編寫過程中,要特別感謝戴志鋒和曾宇容等人,是他們在長期教學(xué)實踐中給予真知灼見的指導(dǎo)。要向王虹致以崇高敬意,本書體例編寫、文字組織得到了他的精心指導(dǎo); 要向薛吉寶、蔣國銀等領(lǐng)導(dǎo)致謝,是他們的堅強領(lǐng)導(dǎo)和有力組織使得該書從簽訂合同到付梓出版僅耗時半年多時間; 要向軟通動力信息技術(shù)(集團(tuán))的陳友華、李江波、苑永超、汪亞軍、袁鹽成等同事們致意,感謝他們的寶貴意見和建議,使該書更能適應(yīng)IT企業(yè)員工的所急所想,更具有實用性; 最后,還要感謝華中科技大學(xué)的陳傳波、云南大學(xué)的李彤,以及南湖地區(qū)計算機聯(lián)盟、湖北省高校計算機學(xué)會聯(lián)盟等單位的支持,沒有他們的不吝賜教與幫助,本書難以如此順利的出版。
第1章緒論
1.1結(jié)構(gòu)化程序設(shè)計的特點
1.1.1水平功能分解
1.1.2垂直逐步分層求精
1.2C++的特點
1.2.1全面兼容C
1.2.2強類型檢查
1.2.3封裝
1.2.4繼承
1.2.5軟件復(fù)用
1.2.6多態(tài)
第2章語言基本要素
2.1基本編程語句
2.2運算與表達(dá)式
2.3聲明與定義
2.3.1變量定義
2.3.2變量聲明
2.3.3函數(shù)定義
2.3.4函數(shù)聲明
2.3.5類聲明與定義
第3章指針與引用
3.1值傳遞
3.1.1賦值兼容性檢查
3.1.2值傳遞時機
3.2指針
3.2.1定義
3.2.2值
3.2.3型與值
3.2.4值傳遞
3.3多重指針
3.4void*指針
3.4.1定義
3.4.2用途
3.5函數(shù)指針
3.6const修飾符
3.7數(shù)組
3.7.1一維數(shù)組
3.7.2多維數(shù)組
3.7.3數(shù)組指針
3.7.4字符串常量與字符數(shù)組
3.7.5越界檢查
3.8引用
3.8.1定義
3.8.2引用傳遞
3.8.3引用的意義
第4章類與對象
4.1類與結(jié)構(gòu)體
4.2類的分析識別過程
4.3訪問控制符
4.3.1類內(nèi)/外部與授權(quán)訪問
4.3.2public訪問屬性
4.3.3private訪問屬性
4.3.4protected訪問屬性
4.4靜態(tài)變量
4.4.1靜態(tài)、全局、局部
4.4.2類的靜態(tài)成員
4.5初始化與構(gòu)造
4.5.1變量聲明、定義與初始化
4.5.2單類構(gòu)造
4.5.3繼承構(gòu)造
4.5.4成員初始化表
4.6析構(gòu)
4.6.1內(nèi)存區(qū)域
4.6.2生命期與作用域
4.6.3內(nèi)存分配/銷毀
4.6.4單類析構(gòu)
4.6.5繼承結(jié)構(gòu)析構(gòu)
4.6.6組合析構(gòu)
4.6.7虛析構(gòu)
第5章多態(tài)
5.1靜態(tài)多態(tài)
5.1.1重載
5.1.2模板
5.2動態(tài)多態(tài)
5.3函數(shù)間關(guān)系
5.3.1重載
5.3.2覆蓋
5.3.3隱藏
5.4針對抽象編程
第6章類間關(guān)系
6.1繼承關(guān)系
6.1.1ISA的軟件復(fù)用含義
6.1.2繼承改寫子類成員訪問控制符
6.1.3繼承帶來的麻煩與問題
6.1.4開閉原則
6.2使用關(guān)系
6.2.1關(guān)聯(lián)
6.2.2聚集
6.2.3依賴
6.2.4聚合優(yōu)先于繼承
6.3程序依賴問題
6.3.1向前引用
6.3.2弱類型依賴
6.3.3雙向依賴
6.4低耦合與高內(nèi)聚
6.4.1低耦合模式
6.4.2高內(nèi)聚模式
6.5消息通信機制
6.5.1同異步消息范疇
6.5.2多進(jìn)程間異步消息通信機制
6.5.3單宿主機單進(jìn)程內(nèi)異步消息通信應(yīng)用范疇
第7章雜項
7.1內(nèi)存泄漏
7.1.1第一類內(nèi)存泄漏
7.1.2第二類內(nèi)存泄漏
7.2運算符重載
7.2.1普通運算符重載
7.2.2成員運算符重載
7.2.3轉(zhuǎn)換構(gòu)造與運算符重載
7.3友元
7.3.1友元函數(shù)
7.3.2友元類
7.4抽象類與純抽象類
7.4.1抽象類
7.4.2純抽象類
7.5virtual“三虛”
第8章高級面向?qū)ο笏枷?/span>
8.1循環(huán)依賴問題
8.2架構(gòu)分析
8.3MVC模式
8.3.1模式設(shè)計目的
8.3.2模式基本結(jié)構(gòu)
8.3.3模式的不足
8.4應(yīng)需而變實例
參考文獻(xiàn)