具體描述
編輯推薦
《新標準C++程序設計/北京大學“程序設計與算法”專項課程係列教材》特色:
本書為北京大學“程序設計與算法”專項課程係列教材之一。教材內容與MOOC課程同步。
本書緊扣新的C++11標準,全麵講述C++麵嚮對象的各種特性,覆蓋標準模闆庫90%以上的內容,讀者通過本書可較全麵掌握C++程序設計的精髓。
本書作者具有豐富的C++教學經驗和數十萬行商業軟件開發經驗,書中所有樣例程序均由作者精心設計,程序風格優美,貼近編程實踐。
內容簡介
《新標準C++程序設計/北京大學“程序設計與算法”專項課程係列教材》是北京大學“程序設計與算法”專項課程係列教材之一。
《新標準C++程序設計/北京大學“程序設計與算法”專項課程係列教材》麵嚮掌握C語言後希望繼續學習C++麵嚮對象編程的讀者,不包含C++語言中與C語言相同的部分。除瞭講授C++麵嚮對象的各種特性外,還強調泛型程序設計的方法以及標準模闆庫STL的應用。作者有多年高校教學經驗,寫作時就已經將容易使學生睏惑的問題的解答融入其中,用簡練的語言直指問題的重點、難點和本質。作者曾開發多款成功的商業軟件,因此本書對語言特性的講解與實踐緊密結閤,程序實例豐富實用,風格優美。程序員與教師兼具的寫作視角,造就瞭本書的與眾不同。書名中的“新標準”有兩層含義:一是指本書的所有講述和程序都嚴格遵循C++新標準;二是指讀者通過本書的學習,對C++語言的掌握程度能夠達到專業程序員的高標準。
《新標準C++程序設計/北京大學“程序設計與算法”專項課程係列教材》可作為高等學校計算機及相關專業C++程序設計課程的教材,也可供對C++程序設計感興趣的讀者自學使用。
作者簡介
郭煒,本科畢業於中國科學技術大學計算機係,碩士畢業於北京大學計算機科學技術係,現為北京大學信息科學技術學院教師。擔任北京大學ACM國際大學生程序設計競賽隊教練12年,從2008年至今,為ACM國際大學生程序設計競賽亞洲區賽站命題十餘場。北京角鬥士軟件技術有限公司創始人,開發《我愛背單詞》等多款成功的商業軟件。兼具豐富的教學經驗和軟件開發實踐經驗。
內頁插圖
目錄
第一篇 麵嚮對象的程序設計
第1章 從C到C++
1.1 C++語言的曆史
1.2 輸入輸齣
1.3 頭文件
1.4 強製類型轉換運算符的新形式
1.5 函數參數的默認值
1.6 引用和函數參數的傳遞
1.7 內聯函數
1.8 函數的重載
1.9 指針和動態內存分配
1.1 0用string對象處理字符串
小結
習題
第2章 類和對象初步
2.1 結構化程序設計的不足
2.2 麵嚮對象程序設計的概念和特點
2.3 類的定義和使用
2.4 類的示例程序剖析
2.5 訪問對象的成員
2.6 類成員的可訪問範圍
小結
習題
第3章 類和對象進階
3.1 構造函數
3.2 析構函數
3.3 構造函數、析構函數和變量的生存期
3.4 靜態成員變量和靜態成員函數
3.5 常量對象和常量成員函數
3.6 成員對象和封閉類
3.7 const成員和引用成員
3.8 友元
3.9 this指針
3.1 0在多個文件中使用類
小結
習題
第4章 運算符重載
4.1 運算符重載的概念和原理
4.2 重載賦值運算符“=”
4.3 淺拷貝和深拷貝
4.4 運算符重載為友元函數
4.5 實例:長度可變的整型數組類
4.6 重載流插入運算符和流提取運算符
4.7 重載類型強製轉換運算符
4.8 重載自增、自減運算符
4.9 運算符重載的注意事項
小結
習題
第5章 繼承與派生
5.1 繼承和派生的概念
5.2 正確處理類的復閤關係和繼承關係
5.3 pmtected訪問範圍說明符
5.4 派生類的構造函數和析構函數
5.5 多層次的派生
5.6 包含成員對象的派生類
5.7 公有派生的賦值兼容規則
5.8 基類與派生類指針的互相轉換
5.9 私有派生和保護派生
5.10 派生類和賦值運算符
小結
習題
第6章 多態與虛函數
6.1 多態的基本概念
6.2 多態的作用
6.3 多態的實現原理
6.4 關於多態的注意事項
6.5 虛析構函數
6.6 純虛函數和抽象類
小結
習題
第7章 輸入輸齣流
7.1 流類
7.2 標準流對象
7.3 使用流操縱算子控製輸齣格式
7.4 調用cout的成員函數
7.5 cin的高級用法
小結
習題
第8章 文件操作
8.1 文件的概念
8.2 C++文件流類
8.3 文件的打開和關閉
8.4 文件的讀寫
8.5 文本方式打開文件與二進製方式打開文件的區彆
小結
習題
第二篇 泛型程序設計
第9章 泛型程序設計與模闆
9.1 函數模闆
9.2 類模闆
9.3 類模闆中的非類型參數
9.4 類模闆與繼承
9.5 類模闆和友元
9.6 類模闆中的靜態成員
9.7 在多個文件中使用模闆
小結
習題
第10章 標準模闆庫STL
10.1 STL中的基本概念
10.2 順序容器
10.3 函數對象
10.4 關聯容器
10.5 容器適配器
10.6 STL算法分類
10.7 不變序列算法
10.8 變值算法
10.9 刪除算法
10.10 變序算法
10.11 排序算法
10.12 有序區間算法
10.13 string類詳解
10.14 bitset對象
小結
習題
第三篇 C++高級主題
第11章 C++高級主題
11.1 static-cast、reinterpret-cast、const-cast和dynamic-cast
11.2 C++異常處理
11.3 C++11新特性概要
小結
習題
附錄:魔獸世界大作業
參考文獻
前言/序言
一、本書的寫作背景
C++功能強大、運用廣泛,許多高校都將其作為入門的程序設計語言進行教學。作者在北京大學信息科學技術學院講授C++程序設計課程已有14年,隨著時間的推移,漸漸覺得現有的教材已經不能滿足教學的需要,於是萌生瞭自己編寫一本C++教材的想法。
C++有兩大特點:支持麵嚮對象的程序設計和支持泛型程序設計。然而,現有的大部分教材往往對“泛型程序設計”這部分內容基本不做介紹,或隻是略作交代。這導緻許多學過或準備學C++的學生有如下印象:C++是為瞭編寫大型程序而設計的,如果編寫一個隻有十幾行或幾十行的小程序,沒有必要用C++,用C語言就足夠瞭。實際上,編寫規模很小的程序用麵嚮對象的設計方法確無必要,但不等於用C++沒必要。C++中的標準模闆庫(STL)是泛型程序設計的最成功應用,其中包含許多常用的數據結構(如動態數組、棧等)和算法(如排序、二分查找等),STL即便應用於隻有十幾行代碼的程序中,也能有效地提高編程效率。對於熟練的C++程序員來說,編寫隻有十幾行代碼的程序多半不會考慮使用麵嚮對象的設計方法,但會很自然地用到STL。C++標準委員會成員AndrewKoenig有句名言:“庫設計就是語言設計,語言設計就是庫設計”。學瞭C++語言,卻不會用該語言的核心庫STL,對於計算機專業的學生來說,這樣的教學很難說是成功的。
國內大多數的C++教材對泛型程序設計和STL講述甚少,國外雖有幾部經典教材,全麵覆蓋瞭C++的兩大特點,但又都捲帙浩繁,動輒近韆頁,不適閤初學者。為瞭解決這個矛盾,作者編寫瞭本書。本書篇幅適中,全麵講述C++麵嚮對象的各種特性,此外還覆蓋標準模闆庫90%以上的內容。初學者通過對本書的學習,可以比較全麵地掌握C++程序設計語言的精髓。
《精通 C++:從基礎到實踐,駕馭現代軟件開發》 內容簡介: 本書旨在為廣大 C++ 愛好者、初學者以及希望深化 C++ 理解的開發者提供一份全麵而深入的指南。我們不僅僅關注 C++ 語言本身,更緻力於幫助讀者掌握使用 C++ 進行高效、可靠軟件開發的現代方法論和設計原則。從最基本的語法概念,到復雜的麵嚮對象編程、泛型編程、並發編程,再到現代 C++ 標準引入的強大特性,本書層層遞進,力求讓讀者在掌握語言工具的同時,培養齣解決實際問題的編程思維。 第一部分:C++ 語言基石與現代開發實踐 本部分將帶領讀者從零開始,構建堅實的 C++ 編程基礎。我們將深入探討 C++ 的核心概念,並結閤現代 C++ 的最佳實踐,讓讀者在學習語言的同時,就能培養齣良好的編程習慣。 章節一:編程世界初探與 C++ 環境搭建 理解編程的本質,程序是如何工作的。 介紹 C++ 語言的曆史、特點及其在軟件開發中的地位。 詳細指導讀者在不同操作係統(Windows, macOS, Linux)上安裝和配置 C++ 開發環境,包括編譯器(如 GCC, Clang, MSVC)和集成開發環境(IDE,如 Visual Studio Code, CLion, Visual Studio)。 編寫並運行第一個 C++ 程序“Hello, World!”,理解編譯、鏈接和運行的完整流程。 學習基本的代碼編輯、調試技巧,以及如何閱讀和理解編譯器給齣的錯誤信息。 章節二:變量、數據類型與基本運算 深入理解 C++ 中各種基本數據類型(整數類型 `int`, `long`, `short`,浮點類型 `float`, `double`,字符類型 `char`,布爾類型 `bool`)的內存錶示、取值範圍和使用場景。 學習如何聲明和初始化變量,理解變量的生命周期和作用域。 掌握算術運算符(`+`, `-`, ``, `/`, `%`)、關係運算符(`==`, `!=`, `<`, `>`, `<=`, `>=`)、邏輯運算符(`&&`, `||`, `!`)和位運算符。 理解運算符的優先級和結閤性,以及如何使用括號改變運算順序。 學習類型轉換(隱式轉換和顯式轉換),以及可能帶來的問題。 引入常量(`const`)的概念,強調其在提高代碼可讀性和安全性中的作用。 章節三:控製流:讓程序擁有決策與循環的能力 學習條件語句 `if`, `else if`, `else`,實現程序的選擇性執行。 掌握多分支選擇語句 `switch`,適用於多個固定值的判斷。 深入理解循環結構:`while` 循環(先判斷後執行),`do-while` 循環(先執行後判斷),以及 `for` 循環(適用於已知循環次數的情況)。 學習如何使用 `break` 和 `continue` 語句控製循環的流程。 講解嵌套循環的應用,以及如何處理復雜的邏輯。 強調在編寫控製流代碼時,保持清晰的邏輯和避免無限循環的重要性。 章節四:函數:代碼復用與模塊化設計 理解函數的作用:代碼的封裝、復用和模塊化。 學習函數的定義、聲明(原型)和調用。 掌握函數參數的傳遞方式:傳值(pass-by-value)和傳引用(pass-by-reference)。 深入理解引用(`&`)的概念及其在函數參數和變量賦值中的強大應用。 講解函數的返迴值,以及如何返迴復雜類型。 學習函數重載(function overloading),允許在同一作用域內定義同名但參數列錶不同的函數。 介紹內聯函數(`inline`)的概念,以及其對性能的潛在影響。 學習遞歸函數(recursive function)的概念和應用,理解其工作原理和注意事項。 強調函數命名規範、參數設計和返迴值設計的原則,以編寫清晰易懂的函數。 章節五:數組與字符串:組織和處理序列化數據 學習一維數組和多維數組的聲明、初始化和訪問。 理解數組的內存布局和下標訪問。 掌握 C 風格字符串(以 null 字符 `' '` 結尾的字符數組)及其常用操作函數(如 `strlen`, `strcpy`, `strcat`, `strcmp`)。 引入 C++ 標準庫提供的 `std::string` 類,學習其豐富的成員函數,如拼接、查找、替換、子串提取等,以及其內存管理優勢。 討論數組與指針的關係,以及通過指針操作數組的技巧。 講解數組越界訪問的危險性,並提齣防範措施。 第二部分:麵嚮對象編程(OOP)的核心與實踐 本部分將帶領讀者進入 C++ 麵嚮對象編程的殿堂,掌握如何設計和構建可維護、可擴展的軟件係統。 章節六:類與對象:封裝、繼承與多態的基石 理解麵嚮對象編程(OOP)的基本思想:將數據和操作數據的方法封裝在一起。 學習如何定義類(`class`),包括訪問修飾符(`public`, `private`, `protected`)的使用。 掌握類的成員(數據成員和成員函數)的定義與訪問。 理解對象的創建(實例化)和銷毀。 深入講解構造函數(constructor)和析構函數(destructor)的作用,以及它們在對象生命周期管理中的重要性。 學習成員初始化列錶,以及其在初始化常量成員和基類成員中的應用。 理解 `this` 指針,指嚮當前對象。 學習靜態成員(`static`)的概念,包括靜態數據成員和靜態成員函數,以及它們的應用場景。 章節七:繼承:代碼的重用與層級結構 理解繼承(inheritance)的概念,允許一個類(派生類)繼承另一個類(基類)的屬性和行為。 學習不同類型的繼承:公有繼承(`public`)、保護繼承(`protected`)、私有繼承(`private`)。 掌握派生類的構造函數和析構函數的調用順序。 理解虛函數(virtual function)的概念,以及它在實現多態性中的關鍵作用。 學習抽象類(abstract class)和純虛函數(pure virtual function),它們定義瞭接口,但不能被實例化。 講解多重繼承(multiple inheritance)的特性和潛在的菱形問題,以及如何避免。 章節八:多態:動態綁定與靈活的程序設計 深入理解多態(polymorphism)的定義和重要性。 學習運行時多態(runtime polymorphism),通過虛函數實現。 掌握嚮上轉型(upcasting)和嚮下轉型(downcasting)。 理解動態綁定(dynamic binding)和靜態綁定(static binding)的區彆。 學習使用指針和引用操作派生類對象,並調用基類中的虛函數,從而實現多態行為。 討論多態在設計模式(如工廠模式、策略模式)中的廣泛應用。 講解如何使用 `dynamic_cast` 和 `static_cast` 進行安全的類型轉換。 章節九:運算符重載與拷貝控製 學習如何為自定義類重載各種運算符(如算術運算符、關係運算符、輸入/輸齣運算符 `<<` 和 `>>`),使自定義類型的使用更直觀。 深入理解拷貝構造函數(copy constructor)和拷貝賦值運算符(copy assignment operator)的作用,以及它們在創建對象副本時的機製。 掌握深拷貝(deep copy)與淺拷貝(shallow copy)的區彆,以及何時需要實現深拷貝。 學習移動構造函數(move constructor)和移動賦值運算符(move assignment operator),利用 C++11 引入的右值引用(rvalue reference)和移動語義,顯著提升資源管理和對象復製的性能。 理解前置與後置的自增/自減運算符重載的區彆。 第三部分:泛型編程、STL 與現代 C++ 特性 本部分將帶領讀者探索 C++ 強大的模闆機製和標準庫,以及現代 C++ 標準引入的革新性特性,助您編寫齣更高效、更優雅的代碼。 章節十:模闆:編寫通用的代碼 理解泛型編程(generic programming)的思想,編寫與類型無關的代碼。 學習函數模闆(function template)的定義和使用,實現通用算法。 掌握類模闆(class template)的定義和實例化,創建通用數據結構。 理解模闆的特化(template specialization),為特定類型提供定製實現。 學習模闆的參數推導(template argument deduction)規則。 討論模闆在減少代碼冗餘和提高代碼通用性方麵的優勢。 章節十一:STL(Standard Template Library):高效的工具箱 介紹 STL 的核心組成部分:容器(containers)、算法(algorithms)和迭代器(iterators)。 容器: 序列容器:`std::vector` (動態數組), `std::list` (雙嚮鏈錶), `std::deque` (雙端隊列)。 關聯容器:`std::set` (有序集閤), `std::map` (有序鍵值對), `std::unordered_set` (哈希集閤), `std::unordered_map` (哈希鍵值對)。 容器適配器:`std::stack`, `std::queue`, `std::priority_queue`。 迭代器: 理解迭代器作為訪問容器元素的通用接口,以及不同類型的迭代器。 算法: 學習 STL 提供的各種通用算法,如排序 (`std::sort`)、查找 (`std::find`)、遍曆 (`std::for_each`)、計數 (`std::count`)、復製 (`std::copy`) 等。 STL 的優勢: 提高開發效率,減少錯誤,提供高效的實現。 章節十二:異常處理與錯誤管理 理解異常(exception)的概念,用於處理程序運行時發生的非正常情況。 學習 `try`, `catch`, `throw` 關鍵字的使用,實現結構化的異常處理。 掌握如何捕獲特定類型的異常,以及如何捕獲所有異常。 學習標準異常類(如 `std::runtime_error`, `std::logic_error`)的使用。 討論異常處理的性能開銷和最佳實踐。 介紹斷言(`assert`)在開發調試階段的應用。 章節十三:內存管理與智能指針 深入理解 C++ 中的內存模型:棧(stack)和堆(heap)。 掌握動態內存分配:`new` 和 `delete` 運算符。 強調手動管理內存的風險:內存泄漏(memory leak)和野指針(dangling pointer)。 引入智能指針(smart pointers)的概念,自動管理動態分配的內存。 重點介紹 `std::unique_ptr`(獨占所有權), `std::shared_ptr`(共享所有權)和 `std::weak_ptr`(弱引用)的用法和區彆。 理解 RAII(Resource Acquisition Is Initialization)原則在資源管理中的重要性。 章節十四:現代 C++ 特性(C++11/14/17/20) C++11: `auto` 類型推導:簡化變量聲明。 範圍 `for` 循環(range-based for loop):更簡潔的遍曆方式。 Lambda 錶達式:匿名函數,方便創建局部函數對象。 右值引用與移動語義:提升性能。 `nullptr`:取代 `NULL`。 `constexpr`:編譯期計算。 C++14/17/20: 模闆參數推導的改進。 結構化綁定(structured bindings):方便解構元組、結構體等。 `if constexpr`:編譯期條件分支。 並行 STL 算法:提升大數據處理性能。 Concepts (C++20):用於約束模闆參數。 Modules (C++20):改進代碼組織和編譯速度。 鼓勵讀者在實際項目中使用這些現代特性,提升代碼質量和效率。 第四部分:進階主題與項目實踐 本部分將觸及更高級的 C++ 主題,並通過實際案例展示如何將所學知識應用於解決復雜的工程問題。 章節十五:文件 I/O 操作 學習使用 C++ 標準庫中的 `fstream` 類(`ifstream`, `ofstream`, `fstream`)進行文本文件和二進製文件的讀寫。 掌握打開、關閉文件,讀寫數據,以及文件模式(如 `ios::in`, `ios::out`, `ios::app`, `ios::binary`)。 講解文件流的狀態檢查(如 `good()`, `eof()`, `fail()`, `bad()`)。 通過實際例子演示如何讀取配置文件、保存程序狀態等。 章節十六:並發編程基礎 介紹多綫程(multi-threading)的概念,以及 C++11 引入的 `std::thread`。 學習綫程的創建、啓動、 join 和 detach。 理解綫程同步問題(race condition)以及互斥鎖(mutex,`std::mutex`)和條件變量(condition variable,`std::condition_variable`)的應用。 介紹原子操作(atomic operations)的概念。 為讀者打開通往並行計算和高性能計算的大門。 章節十七:設計模式入門 介紹幾種常用的設計模式,如工廠模式(Factory Pattern)、單例模式(Singleton Pattern)、觀察者模式(Observer Pattern)等。 講解設計模式的意圖、結構和優缺點。 通過 C++ 代碼示例展示如何應用這些模式來解決常見的軟件設計問題,提升代碼的可維護性和可擴展性。 章節十八:構建實際 C++ 項目 從需求分析到代碼實現,指導讀者完成一個或多個具有代錶性的 C++ 項目。 項目可能包括:一個簡單的命令行工具、一個文本編輯器、一個小型圖形界麵應用(使用第三方庫如 Qt 或 wxWidgets)、一個數據處理程序等。 強調在項目開發過程中,如何應用之前章節中學到的所有知識點,包括麵嚮對象設計、STL、異常處理、內存管理等。 鼓勵讀者進行代碼重構、單元測試和性能優化。 總結: 本書力求提供一條係統化的 C++ 學習路徑,從最基礎的語法元素,逐步深入到高級概念和現代 C++ 的強大特性。我們堅信,掌握 C++ 不僅是學習一門語言,更是掌握一種嚴謹的思維方式和強大的工具。通過本書的學習,讀者將能夠獨立設計、開發和維護復雜的 C++ 應用程序,為在軟件開發領域取得成功奠定堅實的基礎。