完美C++(第5版)(雙色)

broadviewbj發表於2014-07-18

完美C++(第5版)(雙色)

薛正華 沈庚 韋遠科 譯

ISBN 978-7-121-23198-8

20146月出版

定價:148.00

788

16

內容提要

《完美C++(第5版)》為讀者提供了一個學習、理解和掌握 C++程式語言的全面檢視,覆蓋面廣、實用性強。書中介紹了 C++的基本資料型別,如字串、陣列、指標、結構體、類等,同時也詳細描述了物件導向程式語言的特性:封裝、繼承和多型,以及這些特性在 C++語言中的具體使用方式。本書的後面章節還重點介紹了模板、鏈式資料結構、標準模板庫以及異常處理等C++語言的進階程式設計知識。這些知識在從事具體程式設計工作時會經常使用到。

《完美C++(第5版)》對C++的一些重點知識,輔以例項進行了重點講解,特別是對一些易混淆、易犯錯的知識點,專門以“陷阱”的組織方式進行深入分析和討論,幫助讀者更好地理解和掌握。《完美C++(第5版)》中各章均含有大量例子及完整的程式碼段和分析,幫助讀者強化對關鍵概念的理解,以及對主題的掌握。各章還配有豐富的自測習題以及答案,幫助讀者進一步提升對C++知識的理解以及實際動手程式設計能力。

原書由知名學者所著,歷經多個版本,根據C++技術的發展,內容不斷完善、豐富,體系完整、實踐性強。

《完美C++(第5版)》可以作為高等院校學習程式設計基本知識以及C++程式語言課程的教材,也可以作為有C++程式設計經驗者的參考書。

目錄

第1章 C++ 基礎 1

1.1 C++簡介 2

C++語言的起源 2

C++與物件導向程式設計 3

C++的特點 3

C++術語 3

C++程式示例 3

1.2 變數、表示式及賦值語句 5

識別符號 5

變數 6

賦值語句 8

string類簡介 9

陷阱:未初始化變數 9

提示:採用有意義的變數名 10

更多賦值語句 11

賦值相容性 11

字面值 12

轉義序列 14

命名常量 14

算數運算子和表示式 16

整數和浮點數除法 17

陷阱:全整數除法 17

型別轉換 18

自增和自減運算子 20

陷阱:求值順序 21

1.3 控制檯輸入/輸出 22

使用cout輸出 22

換行符 23

提示:以\n或endl結束程式 24

格式化浮點數 24

用cerr輸出 25

用cin輸入 25

提示:輸入/輸出中的換行 28

1.4 程式設計風格 28

註釋 28

1.5 庫與名稱空間 29

庫與include命令 29

名稱空間 29

陷阱:庫名的問題 30

第2章 流程控制 37

2.1 布林表示式 38

建立布林表示式 38

陷阱:不等式連寫 39

布林表示式求值 40

優先順序規則 41

陷阱:整數值用作布林值 44

2.2 分支機制 45

if-else語句 45

複合語句 47

陷阱:用=代替== 47

省略else 49

巢狀語句 49

多分支if-else語句 49

switch語句 50

陷阱:遺漏switch語句中的break 52

提示:在選單中使用switch語句 52

列舉型別 53

條件運算子 53

2.3 迴圈 54

while和do-while迴圈 54

再談自增和自減運算子 57

逗號運算子 58

for語句 59

提示:重複N次的迴圈 61

陷阱:for語句中額外的分號 62

陷阱:無限迴圈 62

break與continue語句 65

巢狀迴圈 67

2.4 檔案輸入簡介 67

透過ifstream讀取文字檔案內容 68

第3章 函式基礎 81

3.1 預定義函式 82

帶有返回值的預定義函式 82

預定義的void函式 86

隨機數生成器 88

3.2 自定義函式 91

定義帶有返回值的函式 91

函式宣告的另一種形式 93

陷阱:引數順序的錯誤 93

呼叫函式的函式 94

示例:一個四捨五入的函式 94

返回布林值的函式 96

定義void函式 96

void函式中的return語句 98

前提條件和執行結果 98

main函式 100

遞迴函式 100

3.3 作用域規則 101

區域性變數 101

過程抽象 103

全域性常量和全域性變數 104

語句塊 106

巢狀作用域 107

提示:在分支和迴圈語句中使用函式呼叫 107

for迴圈體中的變數宣告 107

第4章 函式與過載 117

4.1 引數 118

傳值引數 118

初識引用引數 120

引用傳遞呼叫機制詳解 122

常量引用引數 124

示例:函式swapValues 124

提示:一種操作,而不是程式碼 125

混合引數列表 126

提示:使用何種引數 126

陷阱:無意的區域性變數 128

提示:選擇形參的名字 129

示例:買比薩 129

4.2 過載與預設實參 132

過載簡介 132

陷阱:自動型別轉換與過載 134

過載解析的規則 135

示例:改寫“買比薩程式” 136

預設引數 138

4.3 函式的測試和除錯 140

assert宏 140

佔位程式和驅動程式 141

第5章 陣列 151

5.1 陣列簡介 152

陣列的宣告和引用 152

提示:對陣列使用for迴圈 154

陷阱:陣列的索引始終是從0開始的 154

提示:使用已定義的常量作為陣列的大小 154

記憶體中的陣列 155

陷阱:陣列越界 157

陣列的初始化 157

5.2 函式中的陣列 159

索引變數作為函式實參 159

整個陣列作為函式實參 160

const修飾符 163

陷阱:const引數的不一致使用 164

返回陣列的函式 164

示例:生產圖表 165

5.3 用陣列程式設計 169

部分填充的陣列 169

提示:不要吝嗇形參的使用 169

示例:查詢陣列 172

示例:給陣列排序 174

5.4 多維陣列 178

多維陣列基礎 178

多維陣列引數 179

示例:使用二維陣列的記分程式 179

第6章 結構體和類 195

6.1 結構體 196

結構體型別 198

陷阱:漏掉結構體定義末尾的分號 200

結構體作為函式引數 201

提示:使用多重結構體 201

結構體的初始化 204

6.2 類 206

定義類和成員函式 206

封裝 211

公有成員和私有成員 211

取值和賦值函式 214

提示:介面和實現的分離 216

提示:封裝的測試 216

結構體與類 217

提示:物件思考 217

第7章 建構函式及其他工具 225

7.1 建構函式 226

建構函式的定義 226

陷阱:無參建構函式 230

建構函式的顯式呼叫 230

提示:總是為類定義一個預設建構函式 231

示例:BankAccount類 233

類型別成員變數 238

7.2 其他工具 241

const修飾符 241

陷阱:const的不一致用法 243

行內函數 246

靜態成員 248

巢狀類和區域性類定義 251

7.3 向量——標準模板庫預覽 251

向量基礎 252

陷阱:方括號的索引超過向量的大小 253

提示:向量的賦值 254

效率問題 255

第8章 運算子過載、友元和引用 263

8.1 基本運算子的過載 264

過載基礎 264

提示:建構函式可以返回一個物件 269

返回常量型別 270

一元運算子的過載 272

作為成員函式的運算子過載 272

提示:類可以訪問其所有物件 275

過載函式呼叫符( ) 275

陷阱:過載 &&、||及逗號運算子 275

8.2 友元函式與自動型別轉換 276

建構函式的自動型別轉換 276

陷阱:成員運算子和自動型別轉換 277

友元函式 277

友元類 280

陷阱:不支援友元的編譯器 281

8.3 引用和其他運算子過載 282

引用 282

提示:返回類的成員變數 283

過載“>>”和“<

提示:應使用什麼樣的返回值型別 289

賦值運算子 291

過載自增和自減運算子 291

過載陣列運算子[ ] 294

基於左值和右值的過載 296

第9章 字串 303

9.1 字串型別陣列 304

C字串值和C字串變數 304

陷阱:對C字串使用 “=” 和 “==” 308

中的其他函式 309

示例: 命令列引數 311

C字串的輸入/輸出 313

9.2 字元操作工具 315

字元的輸入/輸出 315

成員函式get和put 315

示例:使用換行函式檢查輸入 318

陷阱:輸入時沒有處理‘\n’ 319

成員函式putback、peek和ignore 320

字元操作函式 322

陷阱:函式toupper和tolower返回int型數值 324

9.3 標準string類 325

標準string類簡介 325

string類的輸入和輸出 327

提示:getline函式的其他版本 330

陷阱:對cin同時使用>>和getline 331

使用string類處理字串 331

示例: 迴文檢測 335

string類物件和C字串的轉換 338

第10章 指標和動態陣列 347

10.1 指標 348

指標變數 349

記憶體管理基礎 355

陷阱:懸空指標 357

動態變數和自動變數 358

提示:定義指標型別 358

陷阱:指標用作傳值引數 360

指標的應用 361

10.2 動態陣列 362

陣列變數和指標變數 362

建立並使用動態陣列 363

示例:一個返回陣列的函式 366

指標運算 368

多維動態陣列 368

10.3 類、指標和動態陣列 371

運算子-> 371

this指標 371

過載賦值運算子 372

示例:部分填充陣列的類 378

解構函式 380

複製建構函式 381

第11章 分散編譯和名稱空間 391

11.1 分散編譯 392

封裝回顧 392

標頭檔案和實現檔案 393

示例:DigitalTime類 399

提示:可重用的元件 401

使用#ifndef 401

提示:定義其他庫 403

11.2 名稱空間 404

名稱空間和using指令 404

建立一個名稱空間 406

using宣告 409

限定名稱 410

提示:為名稱空間取名 412

示例:一個定義在名稱空間中的類 412

無名稱的名稱空間 413

陷阱:混淆全域性名稱空間和無名稱名稱空間 418

提示:用無名稱名稱空間代替static修飾符 419

提示:隱藏幫助函式 419

巢狀名稱空間 420

提示:應該如何指明使用的名稱空間 420

第12章 流和檔案I/O操作 429

12.1 I/O流 430

檔案I/O 431

陷阱:流變數的使用限制 434

向檔案追加輸出內容 435

提示: 開啟檔案的另一種方法 436

提示:檢查一個檔案是否已被成功開啟 439

字元I/O 440

檔案結束檢查 440

12.2 I/O流工具 444

使用檔名輸入 444

使用流函式進行格式化輸出 444

控制符 447

儲存設定的標記 448

更多的輸出流成員函式 449

示例:整理檔案格式 450

示例:編輯文字檔案 452

12.3 流的繼承層次:繼承概述 455

流之間的繼承 455

示例:另一版本的newLine函式 457

使用類stringstream解析字串 460

12.4 隨機檔案存取 462

第13章 遞迴 477

13.1 遞迴void函式 478

示例:豎直排列的數字 479

跟蹤一個遞迴呼叫 481

深入理解遞迴 484

陷阱:無限遞迴 485

遞迴呼叫中的棧 487

陷阱:棧溢位 488

遞迴與迭代的比較 488

13.2 有返回值的遞迴函式 489

有返回值的遞迴函式的一般形式 489

示例:另一個冪函式 490

交叉遞迴 494

13.3 按遞迴方式思考問題 496

遞迴設計技巧 496

二分查詢 497

編碼 498

檢查遞迴是否正確 501

效率 502

第14章 繼承 513

14.1 繼承基礎 514

派生類 514

派生類的建構函式 522

陷阱:使用基類的私有成員變數 524

陷阱:私有成員函式是無法被有效繼承的 526

protected限定符 526

成員函式的重定義 529

重定義與過載 530

訪問被重定義過的基類函式 531

不可被繼承的函式 532

14.2 利用繼承程式設計 533

派生類中的賦值運算子和複製建構函式 533

派生類的解構函式 534

示例:可備份的部分填充的陣列 534

陷阱:賦值運算子兩邊是同一個物件 541

示例:PFArrayDBak的另一種實現 542

提示:一個類可以訪問本類所有物件的私有成員 544

提示:“是一個”和“有一個” 544

保護繼承和私有繼承 545

多繼承 546

第15章 多型與虛擬函式 555

15.1 虛擬函式基礎 556

延遲繫結 556

C++中的虛擬函式 557

提示:virtual屬性會被繼承 563

提示:什麼時候應該使用虛擬函式 563

陷阱:沒有對虛成員函式進行定義 564

抽象類與純虛擬函式 564

示例:抽象類 565

15.2 指標和虛擬函式 567

虛擬函式與擴充套件型別相容性 567

陷阱:切片問題 571

提示:使解構函式成為虛擬函式 572

向下型別轉換和向上型別轉換 573

C++如何實現虛擬函式 574

第16章 模板 585

16.1 函式模板 586

函式模板語法 587

陷阱:編譯器的複雜性 590

提示:如何定義模板 592

示例:一個通用的排序函式 592

陷阱:使用模板時誤用了不正確的資料型別 596

16.2 類别範本 597

類别範本語法 598

示例:一個陣列模板類 601

模板中的vector和 basic_string 606

16.3 模板和繼承 606

示例: 帶備份的部分填充陣列模板類 607

第17章 鏈式資料結構 617

17.1 節點和連結串列 619

節點 619

連結串列 623

在連結串列頭插入節點 625

陷阱:丟失節點 627

插入和刪除連結串列內的節點 628

陷阱:對動態資料結構使用賦值運算子 631

搜尋連結串列 631

搜尋函式虛擬碼 632

雙向連結串列 633

為雙向連結串列增加一個節點 635

從雙向連結串列中刪除一個節點 635

示例: 使用雙向連結串列實現的通用排序模板函式 641

17.2 連結串列的應用 644

示例:棧模板類 644

示例:佇列模板類 650

提示:名稱空間的註解 652

友元類以及類似的其他選擇 653

示例:包含節點鏈的雜湊表 655

字串雜湊函式 656

雜湊表的效率 660

示例:集合(set)模板類 661

集合的基本操作 662

連結串列建立的集合的效率 667

17.3 迭代器 668

指標作為迭代器 668

迭代器類 669

示例:迭代器類 670

17.4 樹 676

樹的屬性 676

示例:樹模板類 678

第18章 異常處理 695

18.1 異常處理基礎 696

異常處理的簡單樣例 697

定義自己的異常類 704

多個丟擲和捕獲 704

陷阱:首先捕獲比較明確的異常 707

提示:異常類可以很簡單 708

在函式中丟擲異常 708

異常說明 710

陷阱:派生類中的異常說明 712

18.2 異常處理的程式設計技術 713

丟擲異常的時機 713

陷阱:未被捕獲的異常 714

陷阱:巢狀try-catch塊 715

陷阱:過度使用異常 715

異常類層次結構 715

可用記憶體測試 716

再次丟擲異常 716

第19章 標準模板庫 721

19.1 迭代器 723

迭代器基礎 723

陷阱:編譯器問題 726

迭代器的種類 728

常量迭代器和可變迭代器 731

反向迭代器 732

其他種類的迭代器 733

19.2 容器 734

連續容器 734

陷阱:迭代器和刪除元素 738

提示:容器中的型別定義 739

容器介面卡棧和佇列 739

陷阱:底層容器 740

關聯式容器set和map 742

效率 747

19.3 泛型演算法 748

執行時間和大-O表示法 749

容器訪問執行時間 752

不改變序列的演算法 753

改變序列的演算法 757

集合演算法 758

排序演算法 7601

前言

本書是介紹C++ 程式語言的教科書,同時也是進行C++ 語言程式設計的參考書。儘管本書包含了一些程式設計的相關技巧,但主要還是圍繞C++ 語言的特徵進行組織的,而不是針對某些程式設計技術展開的技術教程。本書主要面向在C++ 程式語言方面還沒有豐富經驗的大學本科學生。因此,作為C++ 程式語言方面的教科書和參考書,本書適合不同層次的讀者。本書開始的章節專門為初學者而準備,其中方框中的內容是面向有經驗的程式設計師介紹的C++ 語言的基本語法。後續章節的編寫也考慮到了初學者,但主要是針對進階讀者介紹C++ 語言的一些高階主題。本書同樣適合那些想自學C++ 語言的讀者。(有些讀者或許希望能有一本包含更多教學內容和基本程式設計技巧的教科書,這些讀者可以參考我編寫的另一本書:Problem Solving with C++,第8 版,Pearson 公司出版。)

本書很全面地介紹了C++ 語言的相關知識,很多內容超出了初學者應該掌握的範圍。例如,本書詳細介紹了繼承、多型、異常處理和標準模板庫(STL)的相關知識。

新版變化

5 版和第4 版採用了相同的程式設計哲學。對於教師而言,無須改變課程各主題的順序以及各主題對應的章節和具體內容。相比第4 版,此次更新的內容包括:

1 章增加了字串類的簡單介紹;第2 章增加了文字檔案資料讀取的簡單介紹。增加這些內容後,教師可以很方便地從第2 章開始就向學生引入大規模的或者現實世界中存在的問題。

12 章增加了對stringstream 的介紹,從而方便在string 型別和其他型別之間做型別轉換。

13 章簡捷地介紹了尾遞迴的概念並且給出了一個相互遞迴的例子。增加了10 個自測練習題和25 個程式設計專案練習。同時,應讀者的要求,部分新增的題目更長且具有更少的限制,給學生留下了更多發揮的空間,可以讓他們設計程式設計方案的能力得到更好的鍛鍊。

更正了第4 版中出現的幾個錯誤。

ANSI/ISO C++ 標準

本書介紹的所有內容完全依照最新的ANSI/ISO C++ 語言標準進行。

標準模板庫

標準模板庫(STL)是一個預先編寫好的包含很多資料結構和演算法的程式設計庫。STL的相關知識和內容恐怕和C++ 核心知識不相上下,因此本書使用了足夠多的篇幅介紹它。書中有一整章的內容是介紹模板的,此外有一整章用來詳細介紹STL。除此之外,其他相關知識點中也包含對STL 相關內容的介紹。

物件導向程式設計

本書是按照C++ 語言的結構組織的。這樣一來,書中前面的幾章都是關於C++ 語言的基本知識,這與介紹其他高階程式語言的書大同小異,並沒有專門針對物件導向程式設計(OOP)。這使得本書適合成為一本參考書,或者用來學習第二門程式語言。考慮到C++ 是一門物件導向程式語言,如果讀者使用C++ 而不是C 來進行程式設計,還是得掌握C++ 語言的物件導向特性。基於此,本書的內容全面涵蓋了封裝、繼承和多型這些C++ 已經實現的物件導向特性。

章節順序的靈活性

本書允許教師自由安排教學內容的順序,對一本參考書而言,這一點是很重要的。作者不會強制教師們按照本書的知識順序安排自己的課程,這不符合自由靈活的設計哲學。為此,本書各章節的開頭都給出了學習本章節需要的知識準備。

讓學生更容易接受

作為一本參考書,只把章節順序安排好是不夠的,此外,確保書中內容的正確和讓教師能有清晰的理解也是不夠的。重點在於如何向初學者呈現書中的內容,從而讓他們容易理解。就像作者其他的書一樣,本書對學生非常友好,易於學習和理解。

要點總結框

書中的每個關鍵知識點都會出現在一個總結方框中。這些要點總結框貫穿了書中的各個章節,可以作為知識點的總結和快速參考內容。此外,這些要點總結框還可以讓讀者方便地查閱那些自己已經有所瞭解但不清楚C++ 語言是如何使用的語法特性。

自測練習

各章節都包含了許多自測練習題,各練習題目的完整答案都在章節的結尾處給出。

其他特性

本書的各章節都包含一些陷阱、程式設計技巧和示例的小節,還有一些完整的程式碼示例,並且都配有程式輸入和輸出的示例。每章的結尾都給出了總結和相關程式設計練習。

本書英文原版的參考網址

本書英文原版的參考網址為 及。關於本書英文原版的相關資源,請與cece.zhang@pearson.com 聯絡並獲取。

致謝

本書的出版得益於許多人提供的寶貴幫助和支援。Addison-Wesley 公司的FrankRuggirello Susan Hartman 最先提出了本書的構思並促成了第1 版的面世,對此我充滿了感激之情。作為本書第2 版、第3 版以及第4 版的編輯,Matt Goldstein 的幫助和付出是本書持續更新和麵世的關鍵,對此我報以誠摯的謝意。我還要感謝Pearson 公司的Chelsea KharakozovaMarilyn LloydYez Alayan 以及所有其他工作人員,感謝他們無私的支援和鼓勵。

以下審閱者對本書提供了寶貴的建議,感謝他們的付出和寶貴建議:

Richard Albright University of Delaware

J. Boyd Trolinger Butte College

Jerry K. Bilbrey, Jr Francis Marion University

Albert M. K. Cheng University of Houston

David Cherba Michigan State University

Fredrick H. Colclough Colorado Technical University

Drue Coles Boston University

Stephen Corbesero Moravian College

Christopher E. Cramer

Ron DiNapoli Cornell University

Qin Ding Pennsylvania State University, Harrisburg

Martin Dulberg North Carolina State University

H. E. Dunsmore Purdue University

Evan Golub University of Maryland

Terry Harvey University of Delaware

Joanna Klukowska Hunter College, CUNY

Lawrence S. Kroll San Francisco State University

Stephen P. Leach Florida State University

Alvin S. Lim Auburn University

Tim H. Lin Cal Poly Pomona

R. M. Lowe Clemson University

Jeffrey L. Popyack Drexel University

Amar Raheja Cal Poly Pomona

Victoria Rayskin University of Central Los Angeles

Loren Rhodes Juniata College

Jeff Ringenberg University of Michigan

Victor Shtern Boston University

Aaron Striegel University of Notre Dame

J. Boyd Trolinger Butte College

Chrysafis Vogiatzis University of Florida

Joel Weinstein Northeastern University

Dick Whalen College of Southern Maryland

特別感謝Kenrick Mock(阿拉斯加大學安克雷奇分校),他負責本書第5 版的更新。為此,他付出了許多辛勞,再一次地滿足了我、編輯及他自己對本書提出的苛刻要求。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-1222291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章