前言
第一篇 C++基礎
第1章 C++概述
1.1 了解計算機
1.1.1 計算機硬件
1.1.2 計算機軟件
1.2 程序設計語言
1.2.1 機器語言
1.2.2 匯編語言
1.2.3 高級語言
1.2.4 數據結構和算法
1.2.5 面向過程的程序設計(POP)
1.2.6 面向對象的程序設計(OOP)
1.3 C++概述
1.3.1 C++語言發(fā)展歷程
1.3.2 C++語言特點
1.3.3 C++程序開發(fā)基本過程
1.4 C++開發(fā)環(huán)境的搭建
1.4.1 Visual C++ 6開發(fā)環(huán)境簡介
1.4.2 開發(fā)步驟
1.5 第一個C++程序
1.6 C語言與C++語言的區(qū)別
1.6.1 程序設計思想的區(qū)別
1.6.2 語法規(guī)范的區(qū)別
1.7 小結
1.8 習題
第2章 開始C++之旅
2.1 C++程序的結構
2.1.1 C++的注釋風格
2.1.2 編譯預處理與新舊標準
2.1.3 主函數
2.1.4 名稱空間
2.1.5 C++語素
2.1.6 縮進與對齊
2.2 變量與基本類型
2.2.1 變量
2.2.2 整型
2.2.3 浮點型
2.2.4 基本字符型
2.2.5 寬字符型
2.2.6 布爾型
2.3 常量
2.3.1 整型常量和浮點型常量
2.3.2 字符型常量
2.3.3 字符串常量
2.3.4 符號常量
2.3.5 枚舉常量
2.4 運算符與表達式
2.4.1 算術運算
2.4.2 邏輯運算
2.4.3 短路表達式
2.4.4 關系運算
2.4.5 大有文章:變量是否為"0"
2.4.6 條件運算
2.4.7 位運算
2.4.8 賦值運算
2.4.9 ++和--
2.4.10 逗號表達式
2.4.11 sizeof運算符與sizeof表達式
2.4.12 運算符的優(yōu)先級和結合性
2.5 類型轉換
2.5.1 賦值轉換
2.5.2 表達式中的轉換
2.5.3 強制類型轉換
2.5.4 函數調用和傳遞參數時的類型轉換
2.6 流程控制語句
2.6.1 if…else…選擇結構
2.6.2 switch結構
2.6.3 if…else…結構和switch結構的比較
2.6.4 for循環(huán)結構
2.6.5 for循環(huán)結構嵌套
2.6.6 while循環(huán)結構
2.6.7 do…while循環(huán)結構
2.6.8 循環(huán)語句的效率
2.6.9 流程轉向控制語句之break
2.6.10 流程轉向控制語句之continue
2.6.11 流程轉向控制語句之goto
2.6.12 程序終止函數exit()
2.7 小結
2.8 習題
第二篇 C++過程開發(fā)
第3章 數組和C風格字符串
3.1 什么是數組
3.2 一維數組
3.2.1 一維數組的聲明
3.2.2 初始化一維數組
3.2.3 一維數組應用舉例
3.2.4 數組操作注意事項
3.3 C風格字符串
3.3.1 C風格字符串的聲明
3.3.2 字符數組的cin和cout
3.3.3 get()函數和getline()函數
3.3.4 cin與get()/getline()函數的搭配問題
3.3.5 訪問C風格字符串中的某個元素
3.3.6 C風格字符串處理函數
3.4 二維數組及多維數組
3.4.1 聲明一個二維數組
3.4.2 初始化二數組
3.4.3 二維數組應用舉例
3.4.4 二維數組在內存中是如何排列元素的
3.4.5 三維數組在內存中是如何排列元素的
3.5 小結
3.6 習題
第4章 指針和引用
4.1 指針的定義與使用
4.1.1 為什么使用指針
4.1.2 聲明一個指針變量
4.1.3 初始化指針變量
4.1.4 指向指針的指針
4.1.5 指針賦值
4.2 指針的運算
4.2.1 指針與整數的加減
4.2.2 同類型指針間的比較
4.2.3 同類型指針相減
4.3 動態(tài)內存分配
4.3.1 使用new動態(tài)分配內存
4.3.2 使用delete釋放動態(tài)申請的內存
4.3.3 使用new申請動態(tài)數組
4.3.4 不要使用或釋放已經釋放的內存塊
4.3.5 使用malloc和free動態(tài)申請內存
4.3.6 動態(tài)內存申請并不一定能成功
4.4 指針和const
4.4.1 禁止改寫指針(常量指針或常指針)
4.4.2 禁止改寫間接引用
4.4.3 既禁止改寫指針,又禁止改寫間接引用
4.5 指針與數組
4.5.1 數組名指針
4.5.2 數組元素的指針形式
4.5.3 指向數組的指針(數組指針)
4.5.4 指針數組
4.5.5 指針與多維數組
4.5.6 指針與字符數組
4.6 引用
4.6.1 引用的聲明
4.6.2 引用的特點
4.6.3 引用的使用限制
4.6.4 其他要說明的問題
4.7 小結
4.8 習題
第5章 結構、共用體和鏈表
5.1 結構
5.1.1 如何定義一個結構
5.1.2 結構變量的聲明和使用
5.1.3 結構變量的初始化
5.1.4 結構變量間是否可以相互賦值
5.1.5 結構體變量的sizeof
5.1.6 結構體的復雜形式
5.2 共用體
5.2.1 共用體的定義
5.2.2 共用體和結構的區(qū)別
5.2.3 共用體變量的聲明和初始化
5.2.4 共用體使用舉例
5.2.5 共用體的sizeof
5.3 結構數組和共用體數組
5.3.1 結構數組的聲明和初始化
5.3.2 共用體數組的聲明和初始化
5.4 指向結構的指針
5.4.1 聲明一個結構指針
5.4.2 結構指針的初始化
5.4.3 使用指針訪問結構成員
5.5 鏈表
5.5.1 鏈表的結構
5.5.2 創(chuàng)建鏈表
5.5.3 鏈表與數組的區(qū)別
5.5.4 鏈表的遍歷和查找
5.5.5 鏈表的插入和刪除
5.5.6 刪除整個鏈表
5.6 小結
5.7 習題
第6章 用函數合理組織程序
6.1 模塊化帶來的好處
6.1.1 函數的調用過程
6.1.2 抽象和封裝
6.1.3 實現一個函數
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.4.3 值傳遞
6.4.4 指針傳遞
6.4.5 引用傳遞
6.4.6 對3種傳遞的補充
6.4.7 缺省參數調用
6.4.8 內聯函數inline
6.5 遞歸
6.6 函數的重載
6.6.1 什么是函數重載
6.6.2 何時使用函數重載
6.6.3 如何實現函數重載
6.6.4 陷阱:隱式轉換導致重載函數出現二義性
6.7 C++如何使用內存
6.7.1 自動存儲(棧存儲)
6.7.2 靜態(tài)存儲(編譯器預分配)
6.8 作用域與可見域
6.8.1 作用域
6.8.2 可見域
6.8.3 函數的作用域和可見域
6.9 小結
6.10 習題
第7章 關于函數的高級專題
7.1 內存使用錯誤剖析
7.1.1 內存泄露
7.1.2 野指針
7.1.3 試圖修改常量
7.1.4 用錯sizeof
7.1.5 內存越界訪問
7.1.6 變量的初始化
7.2 重申:函數參數傳遞和返回機制
7.2.1 參數傳遞時的"副本"
7.2.2 函數返回時的"副本"
7.3 函數與指針
7.3.1 指向函數的指針
7.3.2 typedef關鍵字
7.3.3 通過函數指針將函數作為另一個函數的參數
7.3.4 函數指針數組
7.3.5 返回函數指針的函數
7.3.6 帶參主函數
7.4 函數與數組
7.4.1 數組名作函數參數
7.4.2 通過指針得到多于1個的回傳值
7.5 函數與結構體、共用體及類對象
7.5.1 3種參數調用
7.5.2 3種返回機制
7.6 函數編寫的建議
7.6.1 合理使用const
7.6.2 檢查輸入參數的有效性
7.6.3 函數返回類型的判斷
7.7 小結
7.8 習題
第三篇 面向對象的C++
第8章 面向對象編程基礎
8.1 面向對象的基本概念
8.1.1 面向對象開發(fā)的優(yōu)勢
8.1.2 什么是類
8.1.3 類是分層的
8.1.4 類和對象的關系
8.2 C++類的定義
8.2.1 類定義的基本形式
8.2.2 類定義示例
8.2.3 類和結構體
8.3 C++類的實現
8.3.1 在類定義時定義成員函數
8.3.2 在類定義的外部定義成員函數
8.4 C++類的使用
8.4.1 聲明一個對象
8.4.2 對象的作用域、可見域和生存期
8.5 對象的創(chuàng)建和撤銷
8.5.1 構造函數的作用
8.5.2 構造函數可以有參數
8.5.3 構造函數支持重載
8.5.4 構造函數允許按參數默認方式調用
8.5.5 初始化表達式
8.5.6 析構函數
8.5.7 顯式調用析構函數
8.6 復制構造函數
8.6.1 復制構造函數調用機制
8.6.2 默認復制構造函數帶來的問題
8.6.3 解決方案--顯式定義復制構造函數
8.6.4 關于構造函數和復制構造函數
8.7 特殊數據成員
8.7.1 const數據成員
8.7.2 引用成員
8.7.3 類對象成員
8.7.4 static數據成員
8.8 特殊函數成員
8.8.1 靜態(tài)成員函數
8.8.2 const與成員函數
8.9 對象的組織
8.9.1 const對象
8.9.2 指向對象的指針
8.9.3 對象的大小
8.9.4 this指針
8.9.5 對象數組
8.9.6 對象鏈表
8.10 為對象動態(tài)分配內存
8.10.1 使用new和delete為單個對象分配/釋放動態(tài)內存
8.10.2 使用new和delete[]為對象數組分配/釋放動態(tài)空間
8.10.3 malloc/free與new/delete
8.11 小結
8.12 習題
第9章 關于對象的高級專題
9.1 類的作用域
9.2 類定義的作用域與可見域
9.3 對象的生存期、作用域和可見域
9.3.1 先定義,后實例化
9.3.2 對象內存釋放與堆內存
9.4 友元
9.4.1 認識友元函數
9.4.2 友元的非成員函數
9.4.3 友元的成員函數
9.4.4 友元函數的重載
9.4.5 友元類
9.4.6 友元是否破壞了封裝性
9.5 運算符重載
9.5.1 運算符重載規(guī)則
9.5.2 運算符重載的優(yōu)點
9.5.3 以成員函數形式重載運算符
9.5.4 以友元函數形式重載運算符
9.5.5 友元函數形式和成員函數形式的比較
9.5.6 對運算符重載的補充說明
9.6 運算符重載范例
9.6.1 賦值運算符
9.6.2 函數調用運算符
9.6.3 下標運算符
9.7 類型轉換
9.7.1 由其他類型向定義類的轉換
9.7.2 由自定義類向其他類型的轉換
9.7.3 隱式轉換帶來的二義性
9.8 小結
9.9 習題
第10章 繼承
10.1 什么是繼承
10.1.1 簡單示例
10.1.2 繼承的層次性
10.2 基類和派生類
10.2.1 基類
10.2.2 public派生與private派生
10.2.3 protected成員與protected派生
10.3 多基派生
10.3.1 多基派生的聲明和定義
10.3.2 二義性問題
10.3.3 消除二義性的解決方案
10.4 虛基類
10.4.1 共同基類帶來的二義性
10.4.2 解決共同基類帶來的二義性
10.4.3 虛基派生二義性與多基派生二義性不同
10.5 派生類的構造函數和析構函數
10.5.1 派生類的構造函數
10.5.2 派生類的析構函數
10.5.3 多基派生類的構造函數和析構函數
10.5.4 虛基派生的構造函數和析構函數
10.6 分清繼承還是組合
10.6.1 繼承不是萬能的
10.6.2 組合
10.7 基類與派生類對象間的相互轉換
10.7.1 類型適應
10.7.2 多基繼承時的情況
10.7.3 公共基類
10.7.4 虛基類的情況
10.8 小結
10.9 習題
第11章 多態(tài)
11.1 多態(tài)與虛函數
11.1.1 靜態(tài)聯編
11.1.2 動態(tài)聯編
11.1.3 為什么需要虛函數
11.1.4 虛函數的聲明和定義
11.2 虛函數的訪問
11.2.1 對象名訪問
11.2.2 基指針訪問
11.2.3 引用訪問
11.2.4 類內訪問
11.2.5 在構造函數或析構函數中進行訪問
11.3 純虛函數與抽象類
11.3.1 純虛函數的聲明和定義
11.3.2 抽象類
11.3.3 另一種抽象類:類中只定義了protected型的構造函數
11.3.4 延伸:構造函數能否為private型
11.3.5 虛析構函數
11.4 虛函數引入的二義性
11.4.1 多基派生
11.4.2 共同基類和虛繼承
11.5 重載、覆蓋與隱藏
11.5.1 重載
11.5.2 覆蓋
11.5.3 隱藏
11.6 小結
11.7 習題
第四篇 泛型編程
第12章 模板
12.1 為什么要定義模板
12.1.1 類型參數化
12.1.2 模板的定義
12.2 函數模板
12.2.1 函數模板的定義
12.2.2 函數模板的使用
12.2.3 隱式實例化
12.2.4 顯式實例化
12.2.5 特化
12.2.6 重載
12.2.7 優(yōu)先級與執(zhí)行順序
12.3 類模板
12.3.1 定義類模板
12.3.2 隱式實例化
12.3.3 顯式實例化
12.3.4 顯式特化
12.3.5 部分特化
12.3.6 重載和優(yōu)先級
12.4 模板的嵌套
12.4.1 函數成員模板
12.4.2 對象成員模板
12.5 模板參數
12.6 小結
12.7 習題
第13章 標準模板庫
13.1 理解STL
13.1.1 容器
13.1.2 適配器
13.1.3 迭代器
13.1.4 算法
13.2 使用序列式容器
13.2.1 序列式容器的創(chuàng)建和元素的訪問
13.2.2 所有容器都支持的特征
13.2.3 序列式容器中元素的插入和刪除
13.2.4 vector容器、deque容器和list容器的比較
13.3 使用關聯式容器
13.3.1 set容器
13.3.2 multiset容器
13.3.3 map容器
13.3.4 multimap容器
13.4 關聯式容器支持的成員函數操作
13.4.1 元素的插入
13.4.2 元素的刪除
13.4.3 元素的查找與訪問
13.5 迭代器
13.5.1 理解迭代器的本質
13.5.2 迭代器的5種類型簡介
13.5.3 為什么要定義這么多迭代器
13.5.4 容器中定義的迭代器類型與5種類型的對應
13.5.5 流迭代器
13.5.6 前向迭代器、雙向迭代器和隨機訪問迭代器
13.5.7 混合迭代器函數
13.5.8 迭代器失效
13.6 泛型算法
13.6.1 什么是函數對象
13.6.2 算法分類
13.7 適配器
13.7.1 容器適配器
13.7.2 迭代器適配器
13.7.3 函數適配器
13.8 小結
13.9 上機實踐習題
第五篇 輸入輸出處理和編程規(guī)范
第14章 輸入輸出和文件
14.1 輸入/輸出概述
14.1.1 什么是文件
14.1.2 流
14.1.3 緩沖區(qū)
14.1.4 重定向
14.1.5 3種輸入/輸出機制
14.2 高層I/O
14.2.1 標準輸出函數printf()
14.2.2 標準輸入函數scanf()
14.2.3 掃描集
14.2.4 sprintf()函數和sscanf()函數
14.2.5 fprintf()函數和fscanf()函數
14.2.6 文件訪問機制
14.3 流類庫
14.3.1 流類庫更安全、更高效
14.3.2 流類庫層次
14.4 輸出流
14.4.1 操作符>操作符
14.5.2 輸入流與格式狀態(tài)字
14.5.3 輸入流與域寬
14.5.4 使用get()函數讀取單個字符
14.5.5 使用get()和getline()函數讀取C風格字符串
14.5.6 其他istream方法
14.6 流狀態(tài)
14.6.1 什么是流狀態(tài)
14.6.2 讀取流狀態(tài)
14.6.3 管理流狀態(tài)
14.7 重載>>和