《C++程序設計與實踐 第2版》采用逐層遞進的方式,通過對案例的分析,將C++的語法及編程方法逐步展開。《C++程序設計與實踐 第2版》以C++ 1y標準為基準,詳細介紹了對象和面向對象技術的概念,并圍繞案例的求解,深入淺出地介紹了面向對象技術的4個核心思想(數據封裝、繼承、多態和泛型編程)在C++中的概念、實現機制和語法、編程方法等,其中包括類和對象、運算符重載、繼承和派生、虛函數和多態性、模板和泛型編程、流庫、多繼承、名字空間和異常處理,使讀者能夠循序漸進地掌握C++的語法以及面向對象程序設計的方法。
本著“能力為重”的理念,在每一章的重要知識點之后均穿插了適量的實踐性題目,建議讀者動手實踐,以加深理解。
《C++程序設計與實踐 第2版》既可作為高等院校計算機專業相關課程的教材,也可作為C++程序員的參考書。
《C++程序設計與實踐 第2版》配套授課電子課件,需要的教師可登錄wwwcmpeducom免費注冊,審核通過后下載,或聯系編輯索取(QQ:2850823885,電話:010-88379739)。
適讀人群 :高等院校計算機專業學生,C++程序員
本書中引入了常用的C++1y標準,并對它們的語法和應用情況做了詳細介紹。重點強調了面向對象技術的4個核心概念:數據封裝、繼承、多態和泛型編程。在每一章講解C++的各項知識點時,基本上都采用了一橫一縱兩個案例來展開。
C++是一門非常優秀的面向對象程序設計語言,它不僅繼承了C語言的全部優點,同時實現了面向對象技術的所有核心概念,使它成為很多程序員,尤其是從C轉過來的程序員開發大型復雜軟件的首選語言。
自從貝爾實驗室的Bjarne Stroustrup博士研發出C++后,這門混合型的語言一直在沿著C++ 98、C++ 0x和C++ 1y(C++ 11和14的合稱)的路線進化,最新的C++ 17也正在被ISO討論中。這些標準的應用使得C++變得更加精致,也更容易使用。
C++是一種混合編程語言。Bjarne Stroustrup這樣描述:C++的強項恰恰在于它支持多種有效的編程風格(多種思維模型)及它們之間的相互組合。最優雅、最有效也最容易維護的解決方案常常涉及不止一種風格(編程模型)。如果一定要用吸引人的字眼,可以說,C++是一種多思維模型的語言。在軟件開發的龐大領域中,需求千變萬化,需要至少一種支持多種編程風格的通用語言,而且很可能需要一種以上。
C++被業界詬病的問題是C++ STL的效率問題。的確,在C++ 11之前,STL因為存在大量的內存復制操作而使系統效率低下。而當C++ 11推出之后,尤其是標準中的右值引用和move語義的應用,使原來的問題不復存在。
目前,C++ 1y標準已被業界廣泛接受,很多程序員都采用此標準編寫應用程序。基于此,本書中引入了最常用的C++ 1y標準,并對它們的語法和應用情況做了詳細介紹。為了能使讀者分辨標準的差異,書中凡是涉及C++ 11標準的內容都被做上了標記。
本書的內容分為以下3部分。
第1部分:14章,主要講解C++的基礎語法。
第2部分:510章,主要講解面向對象技術在C++中的實現。
第3部分:1113章,主要講解面向對象技術中的高級話題。
作為講解面向對象技術的教材,本書重點強調了面向對象技術的4個核心概念:數據封裝、繼承、多態和泛型編程,而對基礎語法部分的介紹并不多。這就要求閱讀本書的讀者應該已系統學習過C語言,或者具有相當的C語言編程經驗。如果這對讀者閱讀本書造成了困擾,敬請諒解。
本書在第1版的基礎上有了較大的改動。除了對章節結構做了一些微調外,筆者還做了大量的文字修訂工作,力圖使行文更加流暢,更容易閱讀和理解,并且重新設計了大部分案例,使讀者在閱讀和實踐時更容易理解和模仿。
本書從第5章起,在每一章講解C++的各項知識點時,基本上都采用了一橫一縱兩個案例來展開。每一章章首的案例貫穿全章,通過對該案例的解析串聯起本章的所有知識點;章尾的案例貫穿全書,用以串接所有的知識點。當然,有些案例會在不同的章節中交叉出現。如果這給讀者的閱讀帶來了困擾,敬請原諒。
由于C++是一門實踐性很強的語言,因此筆者強烈建議讀者在學習時多上機實踐,這樣才能將面向對象技術(而不僅僅是C++的語法特性)掌握得更加牢固。
雖然筆者在高校從事了多年的C++教學及C++應用研發,但對這門與時俱進的語言仍然有不能把握的地方。如果讀者在書中發現謬誤,敬請指正,不勝感激。
前言
第1章引論
1.1對象的概念
1.1.1現實世界中的對象
1.2.1計算機中的對象
1.2面向過程和面向對象
1.2.1面向過程方法
1.2.2面向對象方法
1.3面向對象技術的核心概念
1.3.1數據封裝
1.3.2繼承
1.3.3多態性
1.3.4泛型編程
1.4C++程序概貌
1.4.1第一個C++程序
1.4.2C++程序的編輯、編譯和鏈接
1.5貫穿全書的案例
第2章C++的數據類型
2.1C++數據類型概覽
2.2標識符、常量和變量
2.2.1標識符
2.2.2常量
2.2.3變量
2.2.4變量的初始化
2.3簡單數據類型
2.3.1整數類型
2.3.2浮點類型
2.3.3枚舉類型
2.4地址數據類型
2.4.1指針類型
2.4.2引用類型
2.4.3右值引用
2.5結構化數據類型
2.5.1數組
2.5.2結構體
2.5.3用typedef定義類型的別名
2.6運算符和表達式
2.6.1常用運算符和表達式
2.6.2幾種特殊的運算符
2.7類型自動推導
2.7.1decltype關鍵字
2.7.2auto關鍵字
2.8lambda表達式
第3章C++語句
3.1C++語句概述
3.1.1表達式語句
3.1.2復合語句
3.1.3標號語句
3.2流程控制結構和語句
3.2.1順序結構
3.2.2選擇結構和語句
3.2.3循環結構和語句
3.2.4跳轉語句
3.3異常處理語句
3.3.1異常的概念
3.3.2拋出異常
3.3.3異常捕獲
第4章函數
4.1函數的原型聲明和定義
4.1.1函數原型聲明
4.1.2函數的類型
4.2函數的參數和返回值
4.2.1函數的參數
4.2.2函數的返回值
4.3函數重載
4.4存儲類修飾符
4.5標識符的作用域和生命期
4.5.1作用域和生命期
4.5.2名字限定
4.6函數的其他話題
4.6.1內聯函數
4.6.2函數遞歸
4.6.3指向函數的指針和引用
4.6.4函數類型作為參數和返回值
類型
4.6.5在C++程序中調用非C++
函數
4.6.6后綴函數返回類型
4.7“圖形學習”案例的C風格
解決方案
4.7.1案例分析
4.7.2形體建模
4.7.3存儲模型
4.7.4改進的形體和鏈表設計
4.7.5形體和鏈表的操作接口設計
4.7.6任務集成
4.7.7建造工程
第5章類和對象
5.1案例分析——平面圓的模型
5.2類與對象
5.2.1類的定義
5.2.2類和對象
5.2.3訪問控制
5.3類的成員
5.3.1數據成員
5.3.2成員函數
5.3.3靜態成員
5.4類對象的初始化
5.5C++的類
5.6數據封裝和信息隱藏的意義
5.7用面向對象的方式思考
5.8“圖形學習”解決方案——
封裝
5.8.1形體類型的類版本
5.8.2鏈表類型的類版本
5.8.3讓任務也成為類
第6章深入類和對象
6.1案例分析——數組
包裝類array
6.2構造函數和析構函數
6.2.1構造函數
6.2.2重載構造函數
6.2.3析構函數
6.2.4復制控制
6.3再談對象創建和初始化
6.3.1對象的創建和釋放
6.3.2對象的初始化
6.4對象和指針
6.4.1this指針
6.4.2指向類對象的指針
6.4.3指向類成員的指針
6.5友元關系
6.5.1友元函數和友元類
6.5.2友元關系的特性
6.6與類和對象相關的問題
6.6.1對象數組
6.6.2類對象作為函數參數和返回值
6.6.3常量對象和mutable關鍵字
6.6.4常成員函數
6.6.5類中的類型
6.7“圖形學習”解決方案——
類強化
6.7.1形體類的構造函數和析構函數
6.7.2列表類的構造函數和析構函數
第7章運算符重載
7.1案例分析——complex類及其
常規運算
7.2運算符的重載形式
7.2.1運算符重載的語法
7.2.2重載運算符規則
7.3常用運算符的重載
7.3.1重載賦值運算符
7.3.2重載算術運算符
7.3.3重載++和--運算符
7.3.4重載關系運算符
7.4幾種特殊運算符的重載
7.4.1重載輸入/輸出運算符>>和<<
7.4.2重載類型轉換運算符
7.4.3重載[]運算符
7.4.4重載指針運算符
7.4.5重載()運算符
7.5“圖形學習”解決方案——為
List類重載運算符
第8章繼承和派生
8.1案例分析——食肉動物的
分類
8.2繼承和派生的詳細介紹
8.2.1繼承的前提:分類
8.2.2繼承的語法及基本概念
8.2.3訪問控制
8.2.4繼承的實現機制
8.2.5基類的protected成員
8.2.6訪問聲明
8.2.7基類靜態成員的派生
8.2.8開閉原則
8.3基類與派生類的關系
8.3.1基類對象的初始化
8.3.2派生類對象和基類對象的
相互轉換
8.3.3派生類中重新定義基類的
成員
8.3.4派生類繼承基類重載的運
算符函數
8.4何時使用繼承
8.4.1類/對象之間的關系
8.4.2組合/聚集復用原則
8.5繼承的意義
8.5.1模塊的觀點
8.5.2類型的觀點
8.6“圖形學習”解決方案——使用
繼承
8.6.1形體類的改造
8.6.2鏈表類的改造
第9章虛函數和多態性
9.1案例分析——派生類重載基類
方法的問題
9.2多態性的概念
9.2.1靜態多態性
9.2.2動態多態性
9.3實現多態的基石——虛函數
9.3.1虛函數的概念和特性
9.3.2虛函數的實現機制
9.3.3override和final描述符
9.4純虛函數和抽象類
9.4.1純虛函數
9.4.2抽象類
9.5類的設計:OOD原則
9.5.1依賴倒置原則
9.5.2接口隔離原則
9.5.3最少知識原則
9.6“圖形學習”解決方案——抽象化
頂層類
9.6.1將Quadrangle類改造成抽象類
9.6.2更為抽象的容器類
第10章模板和泛型編程
10.1案例分析——被類型困擾的
函數重載和類
10.2函數模板
10.2.1函數模板的定義和使用
10.2.2重載模板函數和非模板函數
10.2.3函數模板的特化
10.3類模板
10.3.1類模板的定義和使用
10.3.2類模板的成員
10.3.3類模板的特化
10.3.4類模板中的友元
10.3.5類模板的繼承和派生
10.4容器類和迭代器
10.4.1容器類的迭代操作
10.4.2迭代器
10.5泛型算法
10.5.1泛型算法函數的設計
10.5.2帶謂詞的泛型算法
10.5.3函數后綴返回類型用于泛型
10.6C++標準模板庫STL
10.6.1C++的標準容器類
10.6.2C++的標準泛型算法和
可調用對象
10.6.3C++ STL的應用
10.7解決方案
第11章流庫
11.1案例分析——C風格輸入/輸
出的缺陷
11.2C++的I/O系統
11.3C++流庫的結構
11.3.1輸入/輸出流的含義
11.3.2C++流庫的基本結構
11.4輸入和輸出
11.4.1istream
11.4.2ostream
11.4.3輸出運算符<<
11.4.4輸入運算符>>
11.5格式控制
11.5.1用iso類成員函數格式化
11.5.2用操縱函數格式化
11.6文件I/O
11.6.1文件的概念
11.6.2文件的打開和關閉
11.6.3文件的讀寫
第12章多繼承
12.1案例分析——正方形的繼承
問題
12.2多繼承的概念
12.2.1多繼承的語法
12.2.2派生類對象的構造和析構
12.3虛繼承和虛基類
12.3.1多繼承的二義性問題
12.3.2虛繼承和虛基類的使用
12.3.3最終派生類對象的初始化
第13章名字空間和異常處理
13.1案例分析——命名沖突和程序
異常
13.2名字空間
13.2.1名字空間的定義
13.2.2嵌套的名字空間
13.2.3using聲明
13.2.4using指令
13.2.5匿名名字空間
13.3異常處理
13.3.1throw和try…catch
13.3.2標準異常類型
13.3.3在構造函數中拋出異常
13.3.4異常匹配
13.3.5含有異常的程序設計
13.3.6異常的典型使用
13.3.7開銷
附錄
附錄AC++關鍵字
附錄B運算符的優先級和結合性
附錄C標準C++頭文件
附錄DUML常用圖例
參考文獻