第3版前言
面向?qū)ο缶幊碳夹g(shù)降低了軟件開發(fā)的復(fù)雜度,提高了軟件開發(fā)的效率,讓開發(fā)人員開發(fā)出高可靠性、可重用和易維護的軟件,是當(dāng)前軟件開發(fā)的主流技術(shù),是每個軟件開發(fā)人員必須具備的技術(shù)基礎(chǔ)。C++語言是在C語言基礎(chǔ)上擴充了面向?qū)ο髾C制而發(fā)展起來的一種程序設(shè)計語言,程序結(jié)構(gòu)靈活,代碼簡潔清晰,可移植性強,支持數(shù)據(jù)抽象、面向過程和面向?qū)ο蟪绦蛟O(shè)計。C++語言因其穩(wěn)定性、高效性、兼容性和可擴展性而被廣泛應(yīng)用于各種領(lǐng)域和系統(tǒng)中,常被用來設(shè)計操作系統(tǒng)(如UNIX、Windows、AppleMacintosh)、設(shè)備驅(qū)動程序或者其他需要在實時約束下直接操作硬件的軟件。圖形學(xué)和用戶界面設(shè)計是使用C++語言最深入的領(lǐng)域,銀行、貿(mào)易、保險業(yè)、遠程通信以及軍事等諸多應(yīng)用領(lǐng)域也常用C++語言設(shè)計其應(yīng)用程序的核心代碼,以求軟件的最佳性能和開發(fā)效率。
無論從編程思想、代碼效率、程序的穩(wěn)定性和可靠性,還是從語言本身的實用性來講,C++語言都是面向?qū)ο蟪绦蛟O(shè)計語言的典范。學(xué)好C++語言,不但能夠用于實際的程序設(shè)計,而且有助于理解面向?qū)ο蟪绦蛟O(shè)計技術(shù)的精髓,再學(xué)習(xí)諸如Java、C#、Python之類的面向?qū)ο蟪绦蛟O(shè)計語言也就簡單了。
多年的教學(xué)和編程實踐經(jīng)驗給本書作者的真切體會是“讀教科書明其理,看技術(shù)書知其用”。教科書的原理剖析和技術(shù)書的案例分析相結(jié)合有利于讀者深刻地理解和掌握C++語言程序設(shè)計的基本原理和技術(shù),有利于讀者將學(xué)到的技術(shù)用于實際的軟件開發(fā)中。
本書基于這樣的認知而編寫,兼具C++技術(shù)書籍和教材的特點,既比較深刻地介紹C++面向?qū)ο蟮某绦蚣夹g(shù)和原理,又清晰地介紹Windows平臺下的C++程序?qū)崿F(xiàn)方法,且通過程序?qū)嵗龑烧咻^好地結(jié)合在一起。書中基于DOS平臺精心設(shè)計了一個貫穿全書大部分章節(jié)的規(guī)模較大的專業(yè)課程類管理程序comFinl,并不斷地利用面向?qū)ο蟮腃++程序技術(shù)擴充該程序的功能,使之成為一個較為完整的綜合程序,并最終將它從DOS平臺移植到Windows系統(tǒng)中,成為一個Windows應(yīng)用程序。讀者可借此掌握C++應(yīng)用程序的設(shè)計方法,以及將基于DOS平臺的自定義類移植到Windows程序中的方法和過程。
自2007年第1版,本書受到了廣大師生和軟件開發(fā)人員的好評,得到了多所高校的認可,被選為教材,重印多次。許多讀者發(fā)來求解書中疑問或習(xí)題參考答案的郵件,一些軟件開發(fā)人員與作者探索了將C++類移植到Windows程序中的方法,也有讀者指出了書中的錯誤和缺限。這些是本書得以進步和持續(xù)發(fā)展的源泉。這次修訂主要體現(xiàn)在以下幾方面:
(1)以C++11標準為藍本修訂了各章節(jié)的內(nèi)容。增加了C++11標準提出的新特征,包括智能指針、lamada函數(shù)、移動對象、構(gòu)造函數(shù)的繼承和委托、對象初始化列表、override和final、pair、tuple容器、noexcept異常等內(nèi)容,刪除了過時及部分較難且不實用的內(nèi)容,并對一些程序案例進行了重新設(shè)計。書中用“11C++”字樣對首次出現(xiàn)的C++11新標準進行了標識,這些內(nèi)容不能在VC++6.0這樣的早期編譯器中進行編譯,必須在支持C++11規(guī)范的編譯環(huán)境中才能夠正常運行。
(2)注重面向?qū)ο蟪绦蛟O(shè)計和分析能力的培養(yǎng)。在介紹類、繼承和多態(tài)設(shè)計時更加重視對類設(shè)計的分析,并用UML方法進行建模,更利于面向?qū)ο缶幊趟季S的培養(yǎng)與形成。
(3)按C++11新標準修訂了全書例程,并在VisualC++2015環(huán)境下進行了運行測試。
本次修訂保留了第2版的整體結(jié)構(gòu),全書共分為12章。第1~2章介紹C++語言的基礎(chǔ)知識。第1章介紹面向?qū)ο蟪绦蛟O(shè)計的主要特征、C++程序的結(jié)構(gòu)、string類型,數(shù)據(jù)輸入/輸出,以及VisualC++2015編程環(huán)境;第2章介紹C++11標準對C語言非面向?qū)ο蠓矫娴臄U充,主要包括智能指針、const和constexpr常量、左值和右值引用、類型轉(zhuǎn)換、lamada表達式、范圍for、函數(shù)重載、內(nèi)聯(lián)函數(shù)、作用域、命名空間及C++文件操作。
第3~9章介紹C++面向?qū)ο蟪绦蛟O(shè)計的思想、特征和方法,包括類和對象、繼承和派生、虛函數(shù)、運算符重載、模板和STL程序設(shè)計、異常、文件和I/O流等內(nèi)容。
第10~11章介紹VisualC++Windows程序設(shè)計的原理和方法。第10章介紹C++Windows程序設(shè)計的基礎(chǔ)知識,包括Windows程序設(shè)計的常用數(shù)據(jù)結(jié)構(gòu)、程序運行原理、消息驅(qū)動、API程序設(shè)計等內(nèi)容;第11章介紹MFC應(yīng)用程序框架的設(shè)計原理和方法,包括事件函數(shù)、對話框、控件、GDI、菜單和工具欄設(shè)計等內(nèi)容。
第12章介紹將第4~9章逐步完善的基于DOS平臺的課程管理程序comFinal移植到Windows程序中的方法。在MFC向?qū)?chuàng)建的應(yīng)用程序框架中逐步引入在DOS平臺下完成的多個自定義類,并通過事件函數(shù)、對話框、工具欄、菜單調(diào)用這些自定義類的對象,示范了在Windows程序中操作自定義類、開發(fā)Windows應(yīng)用軟件的方法。
本書內(nèi)容全面、析理透徹、注重實用,精心設(shè)計了易于理解和有代表性的示意圖和案例程序,深入淺出地展示了C++面向?qū)ο蟪绦蛟O(shè)計的原理和各種技術(shù),并對面向?qū)ο缶幊踢^程中容易發(fā)生的誤解和錯誤進行重點分析,頗具啟發(fā)性。
本書由杜茂康、謝青、李昌兵、王永、劉友軍和袁浩編寫。杜茂康編寫了第1、2、3、4章,謝青編寫了第5、6、7、8章,李昌兵編寫了第9章,王永編寫了第10章,袁浩編寫了第11章,劉友軍編寫了第12章,全書由杜茂康審校和統(tǒng)稿。
本書在編寫過程中得到了不少專家、學(xué)者、老師和同事的指導(dǎo)、支持和幫助,2004級信息管理與信息系統(tǒng)專業(yè)兩位熱愛程序技術(shù)的學(xué)生李明闖和王曉潤仔細地閱讀了本書第1版初稿中的全部內(nèi)容,校正了初稿中的許多錯誤,廣大讀者也指正了本書前兩版的錯誤和不當(dāng)之處,并提出了許多有用的建議。在此,謹向他們表示誠摯的感謝!
在本書的編寫過程中閱讀參考了國內(nèi)外大量C++程序設(shè)計的相關(guān)書籍,這些書籍已被列在書后的參考文獻中,在此謹向這些書籍的作者表示衷心感謝!
面向?qū)ο蟪绦蛟O(shè)計是一項不斷發(fā)展變化的程序技術(shù),C++語言更是博大精深,其標準和規(guī)范也在不斷更新,鑒于作者才疏學(xué)淺,水平有限,加之經(jīng)驗不足,書中一定存在不少錯誤和不當(dāng)之處,懇請專家、同行和讀者批評指正。
為了便于讀者學(xué)習(xí)和教師教學(xué),本書配有以下教學(xué)資源:全部例題的程序代碼、部分習(xí)題的程序代碼、配套的電子課件。有需要者可從華信教育資源網(wǎng)(http://www.hxedu.com.cn)上進行下載。
作者
杜茂康,重慶郵電大學(xué)經(jīng)濟管理學(xué)院教授,主要教授《數(shù)據(jù)處理》、《C++程序設(shè)計》、《大學(xué)計算機》等課程,專業(yè)帶頭人,出版多部教材。
目 錄
第1章 C++與面向?qū)ο蟪绦蛟O(shè)計概述 1
1.1 面向過程和面向?qū)ο蟪绦蛟O(shè)計 1
1.2 面向?qū)ο蟪绦蛘Z言的特征 3
1.3 C++與面向?qū)ο蟪绦蛟O(shè)計 5
1.3.1 C++簡史 6
1.3.2 C++的特點 7
1.3.3 C++程序的結(jié)構(gòu) 7
1.3.4 標準C++程序設(shè)計 9
1.4 數(shù)據(jù)的輸入和輸出 11
1.4.1 C++的數(shù)據(jù)類型 11
1.4.2 流的概念 12
1.4.3 cin和提取運算符>> 12
1.4.4 cout和插入運算符<< 14
1.4.5 輸出格式控制符 16
1.4.6 數(shù)制基數(shù) 17
1.4.7 string與字符串輸入/輸出 18
1.4.8 數(shù)據(jù)輸入的典型問題 19
1.5 編程實作――Visual C++ 2015編程簡介 24
習(xí)題1 26
第2章 C++基礎(chǔ) 28
2.1 C++對C語言數(shù)據(jù)類型的擴展 28
2.2 左值、右值及C++對局部變量聲明的改進 29
2.2.1 左值和右值 29
2.2.2 C++局部變量的聲明與定義 29
2.3 指針 30
2.3.1 指針概念的回顧 30
2.3.2 空指針、void*以及獲取數(shù)組首、尾元素位置的指針 31
2.3.3 new和delete 32
2.3.4 智能指針11C++ 34
2.4 引用 36
2.4.1 左值引用 36
2.4.2 右值引用11C++ 39
2.5 const和constexpr常量 40
2.5.1 常量的定義 40
2.5.2 const、constexpr與指針 41
2.5.3 const與引用 42
2.5.4 頂層const和底層const 43
2.6 auto和decltype類型11C++ 44
2.7 begin、end和基于范圍的for循環(huán)11C++ 45
2.8 類型轉(zhuǎn)換 46
2.9 函數(shù) 49
2.9.1 函數(shù)原型 49
2.9.2 函數(shù)參數(shù)傳遞的類型 50
2.9.3 函數(shù)默認參數(shù) 54
2.9.4 函數(shù)返回值 55
2.9.5 函數(shù)重載 57
2.9.6 函數(shù)與const和constexpr 60
2.9.7 內(nèi)聯(lián)函數(shù) 62
2.10 Lamada表達式11C++ 63
2.11 命名空間 65
2.12 預(yù)處理器 67
2.13 作用域和生命期 68
2.13.1 作用域 68
2.13.2 變量類型及生命期 70
2.13.3 初始化列表、變量初始化與賦值 71
2.13.4 局部變量與函數(shù)返回地址 73
2.14 文件輸入和輸出 73
2.15 編程實作 75
習(xí)題2 77
第3章 類和對象 81
3.1 類的抽象和封裝 81
3.1.1 抽象 81
3.1.2 封裝 83
3.2 struct和class 85
3.2.1 C++對struct的擴展 85
3.2.2 類(class) 87
3.3 數(shù)據(jù)成員 89
3.4 成員函數(shù) 90
3.4.1 成員函數(shù)定義方式和內(nèi)聯(lián)函數(shù) 90
3.4.2 常量成員函數(shù) 91
3.4.3 成員函數(shù)重載和默認參數(shù)值 92
3.5 對象 92
3.6 構(gòu)造函數(shù)設(shè)計 95
3.6.1 構(gòu)造函數(shù)和類內(nèi)初始值 95
3.6.2 默認構(gòu)造函數(shù) 97
3.6.3 重載構(gòu)造函數(shù) 100
3.6.4 構(gòu)造函數(shù)與初始化列表 102
3.6.5 委托構(gòu)造函數(shù)11C++ 104
3.7 析構(gòu)函數(shù) 105
3.8 賦值運算符函數(shù)、拷貝構(gòu)造函數(shù)和移動函數(shù)設(shè)計 107
3.8.1 賦值運算符函數(shù) 107
3.8.2 拷貝構(gòu)造函數(shù) 110
3.8.3 移動函數(shù)11C++ 113
3.9 靜態(tài)成員 117
3.10 this指針 120
3.11 對象應(yīng)用 124
3.12 類的作用域和對象的生存期 128
3.13 友元 131
3.14 編程實例:類的接口與實現(xiàn)的分離 132
3.14.1 頭文件 133
3.14.2 源文件 134
3.14.3 對類的應(yīng)用 135
習(xí)題3 138
第4章 繼承 142
4.1 繼承的概念 142
4.2 protected和繼承 143
4.3 繼承方式 144
4.4 派生類對基類的擴展 147
4.4.1 成員函數(shù)的重定義和名字隱藏 147
4.4.2 基類成員訪問 149
4.4.3 using和隱藏函數(shù)重現(xiàn)11C++ 149
4.4.4 派生類修改基類成員的訪問權(quán)限 150
4.4.5 友元與繼承 151
4.4.6 靜態(tài)成員與繼承 152
4.4.7 繼承和類作用域 154
4.5 構(gòu)造函數(shù)和析構(gòu)函數(shù) 155
4.5.1 派生類構(gòu)造函數(shù)的建立規(guī)則 155
4.5.2 派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用次序 159
4.5.3 派生類的賦值、拷貝和移動操作 161
4.6 基類與派生類對象的關(guān)系 163
4.6.1 派生類對象對基類對象的賦值和初始化 163
4.6.2 派生類對象與基類對象的類型轉(zhuǎn)換 165
4.7 多重繼承 167
4.7.1 多重繼承的概念和應(yīng)用 167
4.7.2 多重繼承方式下成員的二義性 169
4.7.3 多重繼承的構(gòu)造函數(shù)和析構(gòu)函數(shù) 169
4.8 虛擬繼承 171
4.9 繼承和組合 175
4.10 編程實例 180
習(xí)題4 185
第5章 多態(tài)性 189
5.1 多態(tài)性概述 189
5.1.1 多態(tài)的概念 189
5.1.2 多態(tài)的意義 191
5.1.3 多態(tài)和聯(lián)編 192
5.2 虛函數(shù) 192
5.2.1 虛函數(shù)的意義 192
5.2.2 override和final 11C++ 195
5.2.3 虛函數(shù)的特性 197
5.3 虛析構(gòu)函數(shù) 201
5.4 純虛函數(shù)和抽象類 202
5.4.1 純虛函數(shù)和抽象類 202
5.4.3 抽象類的應(yīng)用 204
5.4 運行時類型信息 210
5.4.1 dynamic_cast 211
5.4.2 typeid 214
5.5 編程實例 216
習(xí)題5 217
第6章 運算符重載 221
6.1 運算符重載基礎(chǔ) 221
6.2 重載二元運算符 223
6.2.1 類與二元運算符重載 223
6.2.2 非類成員方式重載二元運算符的特殊用途 226
6.3 重載一元運算符 227
6.3.1 作為成員函數(shù)重載 228
6.3.2 作為友元函數(shù)重載 229
6.4 特殊運算符重載 230
6.4.1 運算符++和--的重載 230
6.4.2 下標[]和賦值運算符= 232
6.4.3 類型轉(zhuǎn)換運算符 234
6.4.4 函數(shù)調(diào)用運算符重載 237
6.5 輸入/輸出運算符重載 238
6.6 編程實例 239
習(xí)題6 244
第7章 模板和STL 247
7.1 模板的概念 247
7.2 函數(shù)模板和模板函數(shù) 248
7.2.1 函數(shù)模板的定義 248
7.2.2 函數(shù)模板的實例化 249
7.2.3 模板參數(shù) 250
7.3 類模板 253
7.3.1 類模板的概念 253
7.3.2 類模板的定義 254
7.3.3 類模板實例化 255
7.3.4 類模板的使用 257
7.4 模板設(shè)計中的幾個獨特問題 258
7.4.1 內(nèi)聯(lián)與常量函數(shù)模板 258
7.4.2 默認模板實參 11C++ 259
7.4.3 成員模板 259
7.4.4 可變參數(shù)函數(shù)模板 11C++ 260
7.4.5 模板重載、特化、非模板函數(shù)及調(diào)用次序 261
7.4 STL 264
7.4.1 函數(shù)對象 264
7.4.2 順序容器 265
7.4.3 迭代器 272
7.4.4 pair和tuple容器 273
7.4.5 關(guān)聯(lián)式容器 276
7.4.6 算法 281
7.5 編程實例 284
習(xí)題7 286
第8章 異常 289
8.1 異常處理概述 289
8.2 C++異常處理基礎(chǔ) 290
8.2.1 異常處理的結(jié)構(gòu) 290
8.2.2 異常捕獲 291
8.3 異常與函數(shù) 292
8.4 異常處理的幾種特殊情況 294
8.5 異常和類 298
8.5.1 構(gòu)造函數(shù)和異常 298
8.5.2 異常類 300
8.5.3 派生異常類的處理 303
習(xí)題8 305
第9章 流和文件 308
9.1 C++ I/O流及流類庫 308
9.2 I/O成員函數(shù) 309
9.2.1 istream流中的常用成員函數(shù) 309
9.2.2 ostream流中的常用成員函數(shù) 311
9.2.3 數(shù)據(jù)輸入、輸出的格式控制 312
9.3 文件操作 315
9.3.1 文件和流 315
9.3.2 二進制文件 317
9.3.3 隨機文件 321
習(xí)題9 322
第10章 C++ Windows程序設(shè)計基礎(chǔ) 325
10.1 Windows程序設(shè)計基礎(chǔ) 325
10.1.1 窗口 325
10.1.2 事件驅(qū)動和消息響應(yīng) 325
10.1.3 Windows程序的文件構(gòu)成 326
10.1.4 Visual C++的Windows程序設(shè)計方法 327
10.2 Windows程序設(shè)計的常用數(shù)據(jù)結(jié)構(gòu) 328
10.3 Windows程序的基本結(jié)構(gòu) 331
10.4 Windows程序的控制流程 333
10.5 Windows程序的數(shù)據(jù)輸出 338
10.6 消息驅(qū)動程序設(shè)計 341
習(xí)題10 344
第11章 MFC程序設(shè)計 346
11.1 MFC程序基礎(chǔ) 346
11.1.1 MFC類 346
11.1.2 MFC程序的結(jié)構(gòu) 348
11.1.3 MFC程序的執(zhí)行流程 350
11.1.4 消息映射 352
11.2 應(yīng)用程序框架 354
11.2.1 用向?qū)Ы?yīng)用程序框架 354
11.2.2 應(yīng)用程序框架的結(jié)構(gòu) 356
11.2.3 應(yīng)用程序框架類之間的關(guān)系 363
11.3 MFC程序的數(shù)據(jù)輸出 364
11.3.1 MFC中的圖形類 364
11.3.2 繪圖對象 366
11.3.3 用MFC向?qū)砑酉⒂成浜瘮?shù) 368
11.3.4 OnPaint函數(shù)與輸出 372
11.4 對話框 373
11.4.1 對話框的類型 373
11.4.2 用資源編輯器建立對話框 374
11.5 菜單和工具欄 379
11.5.1 直接修改應(yīng)用程序框架的菜單 379
11.5.2 建立新菜單欄 382
11.5.3 工具欄操作 383
11.6 視圖與文檔 384
習(xí)題11 387
第12章 MFC綜合程序設(shè)計 389
12.1 在應(yīng)用程序框架中包含并修改自定義類 389
12.2 在事件函數(shù)中操作類對象 391
12.3 添加對話框 394
12.4 添加程序菜單 396
12.5 文檔序列化 399
習(xí)題12 409
參考文獻 410