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