內容簡介
本書是一本集C++語言高級特性和面向對象思想於一身的中級技術指南。在涵蓋了C++語言的主要特點(封裝、繼承、多態)之餘,從軟體建模的視角出發,引入了針對抽象編程、聚合優先於繼承、低耦合、高內聚等面向對象思想的講述。此外,對困惑程式設計師已久的程式依賴問題做了深入分析; 給出了異步訊息通信的原理及實現; 引入了架構分析,對循環依賴和MVC模式的原理實現及缺陷改良也做了深入論述。本書有別於一般介紹C++語言的書籍,涉及了一些底層原理和編譯知識的挖掘理解; 不同於純粹介紹軟體模式等面向對象設計方面的書籍,在內容設計上注重由淺入深,實例指導; 結合面向對象思想,對各種軟體基礎模式的原理思想和實現也有介紹。
本書可作為高等院校相關專業高年級本科生、研究生的教材,也可作為軟體開發領域工程師的參考書。
序
所有從事計算機行業的人都離不開C/C++語言的學習,但那種艱難歷程相信不少人都終生難忘。雖然國內外的經典C/C++技術書籍流行甚廣、讀者眾多,如《深度探索C++對象模型》、《C++Effective》、《Thinking in C++》、《C++Primer》等,但適合在校大學生和入門讀者的不多,適合中級程式設計師水平的也不多,特別是將軟體建模的基礎模式與程式語言結合起來貫徹面向對象思維進行講述更為少見。
欣慰地看到本書作者們的辛勤努力。當展開目錄時,就有一種不同尋常的感覺。該書關於語言基本要素部分的講述不足5頁,但對於類對象、類間關係則花費了140頁之多來深入闡述,這對於一本首先致用於教學用書來說是一種大膽嘗試和創新。
這是一本適合中高級程式設計師學習和系統回顧掌握複雜特性的技術參考書。能夠看到作者們為減緩讀者學習坡度做了精心設計,在章節內“巧借聯想”多處搭橋; 在闡述引用前先將指針闡述透徹加以分析對比; 介紹軟體復用時把面向對象思想原則中最基礎和重要的內容通過詳例闡明; 講述對象構造、析構時對記憶體機制分析清晰; 講述兩類多態時又將預編譯處理、編譯綁定、運行時綁定有效結合; 在論述應需而變時,從函式指針動態切換、通用指針等C語言的一些向高級階段發展的趨勢入手,漸進引入到C++動態多態以不變應萬變。諸如此類,可見作者們的精心考量和智慧。
盧炎生
武漢工商學院副校長
原華中科技大學計算機學院副院長
2014年7月
目錄
第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多態
第2章語言基本要素
2.1基本編程語句
2.2運算與表達式
2.3聲明與定義
2.3.1變數定義
2.3.2變數聲明
2.3.3函式定義
2.3.4函式聲明
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函式指針
3.6const修飾符
3.7數組
3.7.1一維數組
3.7.2多維數組
3.7.3數組指針
3.7.4字元串常量與字元數組
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靜態變數
4.4.1靜態、全局、局部
4.4.2類的靜態成員
4.5初始化與構造
4.5.1變數聲明、定義與初始化
4.5.2單類構造
4.5.3繼承構造
4.5.4成員初始化表
4.6析構
4.6.1記憶體區域
4.6.2生命期與作用域
4.6.3記憶體分配/銷毀
4.6.4單類析構
4.6.5繼承結構析構
4.6.6組合析構
4.6.7虛析構
第5章多態
5.1靜態多態
5.1.1重載
5.1.2模板
5.2動態多態
5.3函式間關係
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關聯
6.2.2聚集
6.2.3依賴
6.2.4聚合優先於繼承
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友元函式
7.3.2友元類
7.4抽象類與純抽象類
7.4.1抽象類
7.4.2純抽象類
7.5virtual“三虛”
第8章高級面向對象思想
8.1循環依賴問題
8.2架構分析
8.3MVC模式
8.3.1模式設計目的
8.3.2模式基本結構
8.3.3模式的不足
8.4應需而變實例
參考文獻
前言
為什麼要寫這樣一本C++技術書籍
本書最開始的想法很簡單,即為定製班的學生服務。本書第一作者在IT行業從業近十年,是軟通動力信息技術(集團)公司的高級系統分析師,同時也是一名高校教師。2010年5月軟通動力公司與筆者所在高校簽訂了C++軟體工程師定製班培養協定,從那時起,就有了系列教材出版計畫,其中《面向對象UML系統分析建模》於2013年9月已由清華大學出版社出版。
從實際教學和工程指導所需來看,為何不能夠集中課時將關注點集中在C++的中高級特性上,少言甚至濾去有關輸入輸出、基本語言特性部分; 為何不能將兩類多態的原理講透徹,讓學生理解多態中蘊含的軟體復用的發展; 為何不能結合軟體設計模式讓學生理解擁抱變化的內涵; 為何不能結合面向對象思想精髓讓學生在初始編程時就養成測試驅動和MVC分層、針對抽象不針對具象的基本素養?每一個IT人,都有著技術的狂熱和理想,自己不例外更希望能適當總結一些單純、適用的東西給這些年輕的IT從業者,希望他們能在商業項目忙碌之餘,手頭上能有一本給予適當啟發的參考書。
自C++語言誕生以來,面向對象程式設計成為主流,但C++語言學習的高難度使得它在程式設計師市場在21世紀初面臨著以Java語言為代表的第二代面向對象程式設計語言的強烈競爭。自Visual Basic、Delphi等客戶前端開發工具出現後,C/C++語言逐步退出桌面端開發工具市場,而退守深植根於嵌入式和後台交換控制領域。1998年Java語言誕生,以其前後台通吃地全面性席捲全球,並迅速迎來Web開發時代,軟體迎來C/S模式向B/S模式的深刻變革。一時間,在桌面開發工具市場上,Java的AWT/SWING所向披靡,摧枯拉朽般消滅了Visual Basic、Delphi、PowerBuilder等開發工具; 在Web開發工具市場,J2EE的JSP+Servlet的Model2模型迅速成為市場主流壓倒ASP框架。更主要的是,Java語言一改程式設計師嚴格的記憶體分配、初始化、釋放自律負責的態度,程式設計師不再需要關注記憶體細節,極大降低了編程難度; Java首創虛擬機即時編譯,使得位元組碼的編譯結果得以在不同虛擬機平台上再次動態編譯執行成為可能,從根本上解決了應用程式的擴OS平台移植難題——此舉從根本上將程式設計師繁重的移植任務交給了Java語言本身,即由JDK的擁有者負責不同版本虛擬機的支持解釋。但不論Java如何強勢,在TIOBE程式語言排行榜獨占鰲頭近十年,但在企業後台交換市場和一些嚴格強調安全性、並發性、效率性能的行業市場,C/C++以其專業性地位牢不可破。縱觀20世紀80年代以來的程式語言市場,C/C++語言該體系遙遙領先於其他程式語言,即便Java語言最強大時期也從未占據20%以上份額; 最近七八年來,隨著移動互聯和手遊的興起,C++以其傑出的底層控制和語言效率王者歸來,與C語言、Java語言一起牢牢占據著TIOBE程式語言排行榜的三甲。
在程式設計師初入行市場薪資水平上,C/C++程式設計師工資一般高於Java程式設計師,近年來對C/C++程式設計師的追逐饑渴熱度直線上升,且與Java程式設計師工資差距呈現不斷擴大趨勢。作為企業任職的高級系統分析師和高校教師雙重身份的我們,不禁疑惑,究竟是怎么了,那些20世紀80~90年代大學生們學習C/C++的狂熱都到哪裡去了?
問題還是出在Java身上,它把程式設計師慣壞了: 它讓身為程式設計師應具有的嚴格、規範和全局性思維不再。越來越多的人認識到,學生必須掌握基礎,必須牢固地理解記憶體和OS機制,而不能什麼都交給虛擬機。數據結構、算法課程,更應植根於C/C++本身特性,而並非各種STL、JDK的教學上。
另外,Java語言和J2EE框架的流行又極大地普及了設計模式和軟體建模的套用。那么反過來,是否可以將這種模式建構系統的觀點套用在C++語言中的教學中,讓從業者、初學者能從浩如煙海的C++知識點中汲取到那最寶貴的百分之十面向對象思想?筆者教學和實施項目之餘,常常想著這樣的念頭如何付諸實施。2013年9月,經過3年認真刪減留下的精簡版的《面向對象UML系統分析建模》終於出版了,該書有別於傳統講述UML和RUP模型的工具書,反而更似一本將建模與設計模式結合的技術專著,得到眾多褒揚之餘,也下定決心再寫一本C++與建模結合的書,讓學習C++語言的人能夠感受到面向對象之美,體驗設計模式之靈活神奇。
書的主要內容有哪些
全書共8章,第1和第2章扼要回顧C語言並介紹C++語言的主要特點(封裝、繼承、多態),對功能分解和逐步分層求精做了深入闡述,對軟體復用做了歸納,對容易混淆的變數/函式聲明、變數/函式定義做了清晰的區分,對多檔案工程常見的頭檔案重複包含問題給出了原理上的分析和解決方法; 第3章將指針和引用一起做了深入的分析比對; 第4章對類和對象做了全面的闡述(類結構、類的分析識別過程、對象初始化、析構); 第5章全面深入地闡述了兩類多態原理,對函式間的重載、覆蓋、隱藏關係做了精確深入的剖析,並引入了針對抽象編程這一關鍵面向對象思想; 第6章對類間的4種關係(繼承、聚合、關聯、依賴)做了清晰描述,結合實例引入了聚合優先於繼承以及低耦合高內聚等面向對象思想的講述,對困惑C++程式設計師的程式依賴問題做了深入挖掘分析,最後詳盡闡述了訊息通信機制,給出了異步訊息通信的原理及實現; 第7章對記憶體泄漏、運算符重載、友元、抽象類以及virtual“三虛”做了全面細緻的分析闡述; 第8章對循環依賴問題、架構分析以及MVC原理實現與缺陷改良做了深入論述,最後引入了一個綜合套用了針對抽象編程、依賴倒置、聚合優先於繼承等面向對象思想的實例。
誰需要本書
學習和了解了一些C++語言特性,但卻始終無法真正邁進面向對象大門的程式設計師可能需要本書; 絕大多數在面向對象領域裡刻苦攻讀、努力實踐、卻遲遲不能看到美好回報的程式設計師可能需要本書; 一些準備學習設計模式、UML軟體建模、軟體重構和軟體體系結構知識的中高級軟體工程師可能需要本書。
分工與答謝
筆者都是從業IT多年的軟體工程師、項目經理或高校教師。孫寶林、崔洪芳和曾長軍負責編寫第1章; 桂超、胡漢武和李祥負責編寫第2章; 關培超、劉坤和鄧沌華負責編寫第3章; 包瓊、陳婕和尤川川負責編寫第7章; 劉鵬遠和溫珏負責其餘章節的編寫及全書統稿。
在本書編寫過程中,要特別感謝戴志鋒和曾宇容等人,是他們在長期教學實踐中給予真知灼見的指導。要向王虹致以崇高敬意,本書體例編寫、文字組織得到了他的精心指導; 要向薛吉寶、蔣國銀等領導致謝,是他們的堅強領導和有力組織使得該書從簽訂契約到付梓出版僅耗時半年多時間; 要向軟通動力信息技術(集團)的陳友華、李江波、苑永超、汪亞軍、袁鹽成等同事們致意,感謝他們的寶貴意見和建議,使該書更能適應IT企業員工的所急所想,更具有實用性; 最後,還要感謝華中科技大學的陳傳波、雲南大學的李彤,以及南湖地區計算機聯盟、湖北省高校計算機學會聯盟等單位的支持,沒有他們的不吝賜教與幫助,本書難以如此順利的出版。
反饋
本書作者是普通的程式設計師,也是高校教師,水平有限,書中錯誤在所難免。歡迎同行和讀者就本書的內容、文字、體例不吝賜教。
編者
2014年9月