産品特色
編輯推薦
一本經久不衰的C++暢銷經典教程;首本支持C++11新標準的程序設計圖書。
它被譽為“開發人員學習C++的必備教程,沒有之一”!
《C++ Primer Plus(第6版)中文版》可以說是一本麵嚮從未學習過C語言甚至是從未學習過編程的人的入門書籍,它的首章從基礎內容講起,先介紹瞭傳統編程的規則,後麵纔著重講解有關麵嚮對象——C++的精髓之一——的有關內容。整個書的結構安排較為閤理,難度爬升較慢。
如果你是一個從未學過C語言(或者壓根沒學會C)的讀者,那麼,我相信這本書更適閤你。
內容簡介
C++是在C語言基礎上開發的一種集麵嚮對象編程、通用編程和傳統的過程化編程於一體的編程語言,是C語言的超集。《C++ Primer Plus(第6版)(中文版)》是根據2003年的ISO/ANSI C++標準編寫的。通過大量短小精悍的程序詳細而全麵地闡述瞭C++的基本概念和技術。全書分為18章和10個附錄,分彆介紹瞭C++程序的運行方式、基本數據類型、復閤數據類型、循環和關係錶達式、分支語句和邏輯操作符、函數重載和函數模闆、內存模型和名稱空間、類的設計和使用、多態、虛函數、動態內存分配、繼承、代碼重用、友元、異常處理技術、string類和標準模闆庫、輸入/輸齣等內容。本書針對C++初學者,從C語言基礎知識開始介紹,然後在此基礎上詳細闡述C++新增的特性,因此不要求讀者有較多C語言方麵的背景知識。本書可以作為高等院校C++課程的教材,也可以供初學者自學C++時使用。
作者簡介
Stephen Prata,在美國加州肯特菲爾得的馬林學院教授天文、物理和計算機科學。他畢業於加州理工學院,在美國加州大學伯剋利分校獲得博士學位。他單獨或與他人閤作編寫的編程圖書有十多本,其中《New C Primer Plus》獲得瞭計算機齣版聯閤會1990年度“How-to”計算機圖書奬,《C++ Primer Plus》獲得瞭計算機齣版聯閤會1991年度“How-to”計算機圖書奬提名。
精彩書評
★約20年前,我是看Stephen Prata的《C Primer Plus》學C語言的。現在Stephen Prata的新書又迴到我手上瞭,這次是《C++ Primer Plus》第六版。對於係統編程語言來說,除瞭C++,我們沒有太多其他的選擇。D語言曾經有挑戰C++的機會,但機會似乎已經消失,我預期未來GO語言也會挑戰C++,但不管怎樣,目前C++依然是王者。這本《C++ Primer Plus》是C++圖書中內容豐富者。C++是一門很容易誤用的語言,學習C++需要钜細靡遺。我選擇用這本書復習並更新我的C++知識。
——創新工場首席架構師 蔡學鏞
目錄
第1章 預備知識
1.1 C++簡介
1.2 C++簡史
1.2.1 C語言
1.2.2 C語言編程原理
1.2.3 麵嚮對象編程
1.2.4 C++和泛型編程
1.2.5 C++的起源
1.3 可移植性和標準
1.3.1 C++的發展
1.3.2 本書遵循的C++標準
1.4 程序創建的技巧
1.4.1 創建源代碼文件
1.4.2 編譯和鏈接
1.5 總結
第2章 開始學習C++
2.1 進入C++
2.1.1 main( )函數
2.1.2 C++注釋
2.1.3 C++預處理器和iostream文件
2.1.4 頭文件名
2.1.5 名稱空間
2.1.6 使用cout進行C++輸齣
2.1.7 C++源代碼的格式化
2.2 C++語句
2.2.1 聲明語句和變量
2.2.2 賦值語句
2.2.3 cout的新花樣
2.3 其他C++語句
2.3.1 使用cin
2.3.2 使用cout進行拼接
2.3.3 類簡介
2.4 函數
2.4.1 使用有返迴值的函數
2.4.2 函數變體
2.4.3 用戶定義的函數
2.4.4 用戶定義的有返迴值的函數
2.4.5 在多函數程序中使用using編譯指令
2.5 總結
2.6 復習題
2.7 編程練習
第3章 處理數據
3.1 簡單變量
3.1.1 變量名
3.1.2 整型
3.1.3 整型short、int、long和long long
3.1.4 無符號類型
3.1.5 選擇整型類型
3.1.6 整型字麵值
3.1.7 C++如何確定常量的類型
3.1.8 char類型:字符和小整數
3.1.9 bool類型
3.2 const限定符
3.3 浮點數
3.3.1 書寫浮點數
3.3.2 浮點類型
3.3.3 浮點常量
3.3.4 浮點數的優缺點
3.4 C++算術運算符
3.4.1 運算符優先級和結閤性
3.4.2 除法分支
3.4.3 求模運算符
3.4.4 類型轉換
3.4.5 C++11中的auto聲明
3.5 總結
3.6 復習題
3.7 編程練習
第4章 復閤類型
4.1 數組
4.1.1 程序說明
4.1.2 數組的初始化規則
4.1.3 C++11數組初始化方法
4.2 字符串
4.2.1 拼接字符串常量
4.2.2 在數組中使用字符串
4.2.3 字符串輸入
4.2.4 每次讀取一行字符串輸入
4.2.5 混閤輸入字符串和數字
4.3 string類簡介
4.3.1 C++11字符串初始化
4.3.2 賦值、拼接和附加
4.3.3 string類的其他操作
4.3.4 string類I/O
4.3.5 其他形式的字符串字麵值
4.4 結構簡介
4.4.1 在程序中使用結構
4.4.2 C++11結構初始化
4.4.3 結構可以將string類作為成員嗎
4.4.4 其他結構屬性
4.4.5 結構數組
4.4.6 結構中的位字段
4.5 共用體
4.6 枚舉
4.6.1 設置枚舉量的值
4.6.2 枚舉的取值範圍
4.7 指針和自由存儲空間
4.7.1 聲明和初始化指針
4.7.2 指針的危險
4.7.3 指針和數字
4.7.4 使用new來分配內存
4.7.5 使用delete釋放內存
4.7.6 使用new來創建動態數組
4.8 指針、數組和指針算術
4.8.1 程序說明
4.8.2 指針小結
4.8.3 指針和字符串
4.8.4 使用new創建動態結構
4.8.5 自動存儲、靜態存儲和動態存儲
4.9 類型組閤
4.10 數組的替代品
4.10.1 模闆類vector
4.10.2 模闆類array(C++11)
4.10.3 比較數組、vector對象和array對象
4.11 總結
4.12 復習題
4.13 編程練習
第5章 循環和關係錶達式
5.1 for循環
5.1.1 for循環的組成部分
5.1.2 迴到for循環
5.1.3 修改步長
5.1.4 使用for循環訪問字符串
5.1.5 遞增運算符(++)和遞減運算符(--)
5.1.6 副作用和順序點
5.1.7 前綴格式和後綴格式
5.1.8 遞增/遞減運算符和指針
5.1.9 組閤賦值運算符
5.1.10 復閤語句(語句塊)
5.1.11 其他語法技巧--逗號運算符
5.1.12 關係錶達式
5.1.13 賦值、比較和可能犯的錯誤
5.1.14 C-風格字符串的比較
5.1.15 比較string類字符串
5.2 while循環
5.2.1 for與while
5.3.2 等待一段時間:編寫延時循環
5.3 do while循環
5.4 基於範圍的for循環(C++11)
5.5 循環和文本輸入
5.5.1 使用原始的cin進行輸入
5.5.2 使用cin.get(char)進行補救
5.5.3 使用哪一個cin.get( )
5.5.4 文件尾條件
5.5.5 另一個cin.get( )版本
5.6 嵌套循環和二維數組
5.6.1 初始化二維數組
5.6.2 使用二維數組
5.7 總結
5.8 復習題
5.9 編程練習
第6章 分支語句和邏輯運算符
6.1 if語句
6.1.1 if else語句
6.1.2 格式化if else語句
6.1.3 if else if else結構
6.2 邏輯錶達式
6.2.1 邏輯OR運算符:||
6.2.2 邏輯AND運算符:&&
6.2.3 用&&來設置取值範圍
6.2.4 邏輯NOT運算符:!
6.2.5 邏輯運算符細節
6.2.6 其他錶示方式
6.3 字符函數庫cctype
6.4 ?:運算符
6.5 switch語句
6.5.1 將枚舉量用作標簽
6.5.2 switch和if else
6.6 break和continue語句
6.7 讀取數字的循環
6.8 簡單文件輸入/輸齣
6.8.1 文本I/O和文本文件
6.8.2 寫入到文本文件中
6.8.3 讀取文本文件
6.9 總結
6.10 復習題
6.11 編程練習
第7章 函數--C++的編程模塊
7.1 復習函數的基本知識
7.1.1 定義函數
7.1.2 函數原型和函數調用
7.2 函數參數和按值傳遞
7.2.1 多個參數
7.2.2 另外一個接受兩個參數的函數
7.3 函數和數組
7.3.1 函數如何使用指針來處理數組
7.3.2 將數組作為參數意味著什麼
7.3.3 更多數組函數示例
7.3.4 使用數組區間的函數
7.3.5 指針和const
7.4 函數和二維數組
7.5 函數和C-風格字符串
7.5.1 將C-風格字符串作為參數的函數
7.5.2 返迴c-風格字符串的函數
7.6 函數和結構
7.6.1 傳遞和返迴結構
7.6.2 另一個處理結構的函數示例
7.6.3 傳遞結構的地址
7.7 函數和string對象
7.8 函數與array對象
7.9 遞歸
7.9.1 包含一個遞歸調用的遞歸
7.9.2 包含多個遞歸調用的遞歸
7.10 函數指針
7.10.1 函數指針的基礎知識
7.10.2 函數指針示例
7.10.3 深入探討函數指針
7.10.4 使用typedef進行簡化
7.11 總結
7.12 復習題
7.13 編程練習
第8章 函數探幽
8.1 C++內聯函數
8.2 引用變量
8.2.1 創建引用變量
8.2.2 將引用用作函數參數
8.2.3 引用的屬性和特彆之處
8.2.4 將引用用於結構
8.2.5 將引用用於類對象
8.2.6 對象、繼承和引用
8.2.7 何時使用引用參數
8.3 默認參數
8.4 函數重載
8.4.1 重載示例
8.4.2 何時使用函數重載
8.5 函數模闆
8.5.1 重載的模闆
8.5.2 模闆的局限性
8.5.3 顯式具體化
8.5.4 實例化和具體化
8.5.5 編譯器選擇使用哪個函數版本
8.5.6 模闆函數的發展
8.6 總結
8.7 復習題
8.8 編程練習
第9章 內存模型和名稱空間
9.1 單獨編譯
9.2 存儲持續性、作用域和鏈接性
9.2.1 作用域和鏈接
9.2.2 自動存儲持續性
9.2.3 靜態持續變量
9.2.4 靜態持續性、外部鏈接性
9.2.5 靜態持續性、內部鏈接性
9.2.6 靜態存儲持續性、無鏈接性
9.2.7 說明符和限定符
9.2.8 函數和鏈接性
9.2.9 語言鏈接性
9.2.10 存儲方案和動態分配
9.3 名稱空間
9.3.1 傳統的C++名稱空間
9.3.2 新的名稱空間特性
9.3.3 名稱空間示例
9.3.4 名稱空間及其前途
9.4 總結
9.5 復習題
9.6 編程練習
第10章 對象和類
10.1 過程性編程和麵嚮對象編程
10.2 抽象和類
10.2.1 類型是什麼
10.2.2 C++中的類
10.2.3 實現類成員函數
10.2.4 使用類
10.2.5 修改實現
10.2.6 小結
10.3 類的構造函數和析構函數
10.3.1 聲明和定義構造函數
10.3.2 使用構造函數
10.3.3 默認構造函數
10.3.4 析構函數
10.3.5 改進Stock類
10.3.6 構造函數和析構函數小結
10.4 this指針
10.5 對象數組
10.6 類作用域
10.6.1 作用域為類的常量
10.6.2 作用域內枚舉(C++11)
10.7 抽象數據類型
10.8 總結
10.9 復習題
10.11 編程練習
第11章 使用類
11.1 運算符重載
11.2 計算時間:一個運算符重載示例
11.2.1 添加加法運算符
11.2.2 重載限製
11.2.3 其他重載運算符
11.3 友元
11.3.1 創建友元
11.3.2 常用的友元:重載<<運算符
11.4 重載運算符:作為成員函數還是非成員函數
11.5 再談重載:一個矢量類
11.5.1 使用狀態成員
11.5.2 為Vector類重載算術運算符
11.5.3 對實現的說明
11.5.4 使用Vector類來模擬隨機漫步
11.6 類的自動轉換和強製類型轉換
11.6.1 轉換函數
11.6.2 轉換函數和友元函數
11.7 總結
11.8 復習題
11.9 編程練習
第12章 類和動態內存分配
12.1 動態內存和類
12.1.1 復習示例和靜態類成員
12.1.2 特殊成員函數
12.1.3 迴到Stringbad:復製構造函數的哪裏齣瞭問題
12.1.4 Stringbad的其他問題:賦值運算符
12.2 改進後的新String類
12.2.1 修訂後的默認構造函數
12.2.2 比較成員函數
12.2.3 使用中括號錶示法訪問字符
12.2.4 靜態類成員函數
12.2.5 進一步重載賦值運算符
12.3 在構造函數中使用new時應注意的事項
12.3.1 應該和不應該
12.3.2 包含類成員的類的逐成員復製
12.4 有關返迴對象的說明
12.4.1 返迴指嚮const對象的引用
12.4.2 返迴指嚮非const對象的引用
12.4.3 返迴對象
12.4.4 返迴const對象
12.5 使用指嚮對象的指針
12.5.1 再談new和delete
12.5.2 指針和對象小結
12.5.3 再談定位new運算符
12.6 復習各種技術
12.6.1 重載<<運算符
12.6.2 轉換函數
12.6.3 其構造函數使用new的類
12.7 隊列模擬
12.7.1 隊列類
12.7.2 Customer類
12.7.3 ATM模擬
12.8 總結
12.9 復習題
12.10 編程練習
第13章 類繼承
13.1 一個簡單的基類
13.1.1 派生一個類
13.1.2 構造函數:訪問權限的考慮
13.1.3 使用派生類
13.1.4 派生類和基類之間的特殊關係
13.2 繼承:is-a關係
13.3 多態公有繼承
13.3.1 開發Brass類和BrassPlus類
13.4 靜態聯編和動態聯編
13.4.1 指針和引用類型的兼容性
13.4.2 虛成員函數和動態聯編
13.4.3 有關虛函數注意事項
13.5 訪問控製:protected
13.6 抽象基類
13.6.1 應用ABC概念
13.6.2 ABC理念
13.7 繼承和動態內存分配
13.7.1 第一種情況:派生類不使用new
13.7.2 第二種情況:派生類使用new
13.7.3 使用動態內存分配和友元的繼承示例
13.8 類設計迴顧
13.8.1 編譯器生成的成員函數
13.8.2 其他的類方法
13.8.3 公有繼承的考慮因素
13.8.4 類函數小結
13.9 總結
13.10 復習題
13.11 編程練習
第14章 C++中的代碼重用
14.1 包含對象成員的類
14.1.1 valarray類簡介
14.1.2 Student類的設計
14.1.3 Student類示例
14.2 私有繼承
14.2.1 Student類示例(新版本)
14.2.2 使用包含還是私有繼承
14.2.3 保護繼承
14.2.4 使用using重新定義訪問權限
14.3 多重繼承
14.3.1 有多少Worker
14.3.2 哪個方法
14.3.3 MI小結
14.4 類模闆
14.4.1 定義類模闆
14.4.2 使用模闆類
14.4.3 深入探討模闆類
14.4.4 數組模闆示例和非類型參數
14.4.5 模闆多功能性
14.4.6 模闆的具體化
14.4.7 成員模闆
14.4.8 將模闆用作參數
14.4.9 模闆類和友元
14.4.10 模闆彆名(C++11)
14.5 總結
14.6 復習題
14.7 編程練習
第15章 友元、異常和其他
15.1 友元
15.1.1 友元類
15.1.2 友元成員函數
15.1.3 其他友元關係
15.2 嵌套類
15.2.1 嵌套類和訪問權限
15.2.2 模闆中的嵌套
15.3 異常
15.3.1 調用abort( )
15.3.2 返迴錯誤碼
15.3.3 異常機製
15.3.4 將對象用作異常類型
15.3.4 異常規範和C++11
15.3.5 棧解退
15.3.6 其他異常特性
15.3.7 exception類
15.3.8 異常、類和繼承
15.3.9 異常何時會迷失方嚮
15.3.10 有關異常的注意事項
15.4 RTTI
15.4.1 RTTI的用途
15.4.2 RTTI的工作原理
15.5 類型轉換運算符
15.6 總結
15.7 復習題
15.8 編程練習
第16章 string類和標準模闆庫
16.1 string類
16.1.1 構造字符串
16.1.2 string類輸入
16.1.3 使用字符串
16.1.4 string還提供瞭哪些功能
16.1.5 字符串種類
16.2 智能指針模闆類
16.2.1 使用智能指針
16.2.2 有關智能指針的注意事項
16.2.3 unique_ptr為何優於auto_ptr
16.2.4 選擇智能指針
16.3 標準模闆庫
16.3.1 模闆類vector
16.3.2 可對矢量執行的操作
16.3.3 對矢量可執行的其他操作
16.3.4 基於範圍的for循環(C++11)
16.4 泛型編程
16.4.1 為何使用迭代器
16.4.2 迭代器類型
16.4.3 迭代器層次結構
16.4.4 概念、改進和模型
16.4.5 容器種類
16.4.4 關聯容器
16.4.5 無序關聯容器(C++11)
16.5 函數對象
16.5.1 函數符概念
16.5.2 預定義的函數符
16.5.3 自適應函數符和函數適配器
16.6 算法
16.6.1 算法組
16.6.2 算法的通用特徵
16.6.3 STL和string類
16.6.4 函數和容器方法
16.6.5 使用STL
16.7 其他庫
16.7.1 vector、valarray和array
16.7.2 模闆initializer_list(C++11)
16.7.3 使用initializer_list
16.8 總結
16.9 復習題
16.10 編程練習
第17章 輸入、輸齣和文件
17.1 C++輸入和輸齣概述
17.1.1 流和緩衝區
17.1.2 流、緩衝區和iostream文件
17.1.3 重定嚮
17.2 使用cout進行輸齣
17.2.1 重載的<<運算符
17.2.2 其他ostream方法
17.2.3 刷新輸齣緩衝區
17.2.4 用cout進行格式化
17.3 使用cin進行輸入
17.3.1 cin>>如何檢查輸入
17.3.2 流狀態
17.3.3 其他istream類方法
17.3.4 其他istream方法
17.4 文件輸入和輸齣
17.4.1 簡單的文件I/O
17.4.2 流狀態檢查和is_open( )
17.4.3 打開多個文件
17.4.3 命令行處理技術
17.4.5 文件模式
17.4.6 隨機存取
17.5 內核格式化
17.6 總結
17.7 復習題
17.8 編程練習
第18章 探討C++新標準
18.1 復習前麵介紹過的C++11功能
18.1.1 新類型
18.8.2 統一的初始化
18.1.3 聲明
18.1.4 智能指針
18.1.5 異常規範方麵的修改
18.1.6 作用域內枚舉
18.1.7 對類的修改
18.1.8 模闆和STL方麵的修改
18.1.9 右值引用
18.2 移動語義和右值引用
18.2.1 為何需要移動語義
18.2.2 一個移動示例
18.2.3 移動構造函數解析
18.2.4 賦值
18.2.5 強製移動
18.3 新的類功能
18.3.1 特殊的成員函數
18.3.2 默認的方法和禁用的方法
18.3.3 委托構造函數
18.3.4 繼承構造函數
18.3.5 管理虛方法:override和final
18.4 Lambda函數
18.4.1 比較函數指針、函數符和Lambda函數
18.4.2 為何使用lambda
18.5 包裝器
18.5.1 包裝器function及模闆的低效性
18.5.2 修復問題
18.5.3 其他方式
18.6 可變參數模闆
18.6.1 模闆和函數參數包
18.6.2 展開參數包
18.6.3 在可變參數模闆函數中使用遞歸
18.7 C++11新增的其他功能
18.7.1 並行編程
18.7.2 新增的庫
18.7.3 低級編程
18.7.4 雜項
18.8 語言變化
18.8.1 Boost項目
18.8.2 TR1
18.8.3 使用Boost
18.9 接下來的任務
18.10 總結
18.11 復習題
18.12 編程練習
附錄A 計數係統
A.1 十進製數
A.2 八進製整數
A.3 十六進製數
A.4 二進製數
A.5 二進製和十六進製
附錄B C++保留字
B.1 C++關鍵字
B.2 替代標記
B.3 C++庫保留名稱
B.4 有特殊含義的標識符
附錄C ASCII字符集
附錄D 運算符優先級
附錄E 其他運算符
E.1 按位運算符
E.1.1 移位運算符
E.1.2 邏輯按位運算符
E.1.3 按位運算符的替代錶示
E.1.4 幾種常用的按位運算符技術
E.2 成員解除引用運算符
E.3 alignof(C++11)
E.4 noexcept(C++11)
附錄F 模闆類string
F.1 13種類型和一個常量
F.2 數據信息、構造函數及其他
F.2.1 默認構造函數
F.2.2 使用C-風格字符串的構造函數
F.2.3 使用部分C-風格字符串的構造函數
F.2.4 使用左值引用的構造函數
F.2.5 使用右值引用的構造函數(C++11)
F.2.6 使用一個字符的n個副本的構造函數
F.2.7 使用區間的構造函數
F.2.8 使用初始化列錶的構造函數(C++11)
F.2.9 內存雜記
F.3 字符串存取
F.4 基本賦值
F.5 字符串搜索
F.5.1 find( )係列
F.5.2 rfind( )係列
F.5.3 find_first_of( )係列
F.5.4 find_last_of( )係列
F.5.5 find_first_not_of( )係列
F.5.6 find_last_not_of( )係列
F.6 比較方法和函數
F.7 字符串修改方法
F.7.1 用於追加和相加的方法
F.7.2 其他賦值方法
F.7.3 插入方法
F.7.4 清除方法
F.7.5 替換方法
F.7.6 其他修改方法:copy( )和swap( )
F.8 輸齣和輸入
附錄G 標準模闆庫方法和函數
G.1 STL和C++11
G.1.1 新增的容器
G.1.2 對C++98容器所做的修改
G.2 大部分容器都有的成員
G.3 序列容器的其他成員
G.4 set和map的其他操作
G.4 無序關聯容器(C++11)
G.5 STL函數
G.5.1 非修改式序列操作
G.5.2 修改式序列操作
G.5.3 排序和相關操作
G.5.4 數值運算
附錄H 精選讀物和網上資源
H.1 精選讀物
H.2 網上資源
附錄I 轉換為ISO標準C++
I.1 使用一些預處理器編譯指令的替代品
I.1.1 使用const而不是#define來定義常量
I.1.2 使用inline而不是# define來定義小型函數
I.2 使用函數原型
I.3 使用類型轉換
I.4 熟悉C++特性
I.5 使用新的頭文件
I.6 使用名稱空間
I.7 使用智能指針
I.8 使用string類
I.9 使用STL
附錄J 復習題答案
第2章復習題答案
第3章復習題答案
第4章復習題答案
第5章復習題答案
第6章復習題答案
第7章復習題答案
第8章復習題答案
第9章復習題答案
第10章復習題答案
第11章復習題答案
第12章復習題答案
第13章復習題答案
第14章復習題答案
第15章復習題答案
第16章復習題答案
第17章復習題答案
第18章復習題答案
精彩書摘
與函數命名一樣,大寫在變量命名中也是一個關鍵問題(參見第2章的注釋“命名約定”),但很多程序員可能會在變量名中加入其他的信息,即描述變量類型或內容的前綴。例如,可以將整型變量myWeight命名為nMyWeight,其中前綴n用來錶示整數值,在閱讀代碼或變量定義不是十分清楚的情況下,前綴很有用。另外,這個變量也可以叫做intMyWeight,這將更精確,而且容易理解,不過它多瞭幾個字母(對於很多程序員來說,這是非常討厭的事)。常以這種方式使用的其他前綴有:str或sz(錶示以空字符結束的字符串)、b(錶示布爾值)、p(錶示指針)和c(錶示單個字符)。
隨著對C++的逐步瞭解,將發現很多有關前綴命名風格的示例(包括漂亮的m_lpctstr前綴——這是一個類成員值,其中包含瞭指嚮常量的長指針和以空字符結尾的字符串),還有其他更奇異、更違反直覺的風格,采不采用這些風格,完全取決於程序員。在C++所有主觀的風格中,一緻性和精度是最重要的。請根據自己的需要、喜好和個人風格來使用變量名(或必要時,根據雇主的需要、喜好和個人風格來選擇變量名)。
3.1.2 整型
整數就是沒有小數部分的數字,如2、98、—5286和0。整數有很多,如果將無限大的整數看作很大,則不可能用有限的計算機內存來錶示所有的整數。因此,語言隻能錶示所有整數的一個子集。有些語言隻提供一種整型(一種類型滿足所有要求!),而C++則提供好幾種,這樣便能夠根據程序的具體要求選擇最閤適的整型。
不同C++整型使用不同的內存量來存儲整數。使用的內存量越大,可以錶示的整數值範圍也越大。另外,有的類型(符號類型)可錶示正值和負值,而有的類型(無符號類型)不能錶示負值。術語寬度(width)用於描述存儲整數時使用的內存量。使用的內存越多,則越寬。C++的基本整型(按寬度遞增的順序排列)分彆是char、short、int、long和C++11新增的long long,其中每種類型都有符號版本和無符號版本,因此總共有10種類型可供選擇。下麵更詳細地介紹這些整數類型。由於char類型有一些特殊屬性(它最常用來錶示字符,而不是數字),因此本章將首先介紹其他類型。
……
前言/序言
學習C++是一次探索之旅,因為這種語言容納瞭好幾種編程範式,其中包括麵嚮對象編程、泛型編程和傳統的過程化編程。本書第 5 版是基於 ISO C++標準編寫的,該標準的官方名稱為 C++99 和 C++03(C++99/C++03),其中2003標準主要是對1999標準的技術修正,並沒有添加任何新功能。C++在不斷發展,編寫本書時,新標準獲得瞭C++國際標準委員會的批準。在製定期間,該標準名為C++0x,但現已改名為C++11。大多數編譯器都能很好地支持C++99/03,而本書的大多數示例都遵守該標準。有些實現中已顯現瞭新標準的很多功能,而本書也對這些新功能進行瞭探索。
本書在介紹C++特性的同時,討論瞭基本C語言,使兩者成為有機的整體。書中介紹瞭C++的基本概念,並通過短小精悍的程序來闡明,這些程序都很容易復製和試驗。書中還介紹瞭輸入和輸齣,如何讓程序執行重復性任務,如何讓程序做齣選擇,處理數據的多種方式,以及如何使用函數等內容。另外,本書還講述瞭C++在C語言的基礎上新增的很多特性,包括:
類和對象;
繼承;
多態、虛函數和RTTI(運行階段類型識彆);
函數重載;
引用變量;
泛型(獨立於類型的)編程,這種技術是由模闆和標準模闆庫(STL)提供的;
處理錯誤條件的異常機製;
管理函數、類和變量名的名稱空間。
初級教程方法
大約20年前,《C Primer Plus》開創瞭優良的初級教程傳統,本書建立在這樣的基礎之上,吸收瞭其中很多成功的理念。
初級教程應當是友好的、便於使用的指南。
初級教程不要求您已經熟悉相關的編程概念。
初級教程強調的是動手學習,通過簡短、容易輸入的示例闡述一兩個概念。
初級教程用示意圖來解釋概念。
初級教程提供問題和練習來檢驗您對知識的理解,從而適於自學或課堂教學。
基於上述理念,本書幫助您理解這種用途廣泛的語言,並學習如何使用它。
對何時使用某些特性,例如何時使用公共繼承來建立is-a關係,提供瞭概念方麵的指導。
闡釋瞭常用的C++編程理念和技術。
提供瞭大量的附注,如提示、警告、注意等。
本書的作者和編輯盡最大的努力使本書簡單、明瞭、生動有趣。我們的目標是,您閱讀本書後,能夠編寫齣可靠、高效的程序,並且覺得這是一種享受。
示例代碼
本書包含大量的示例代碼,其中大部分是完整的程序。和前一版一樣,本書介紹的是通用C++,因此適用於任何計算機、操作係統和編譯器。書中的示例在Windows 7係統、Macintosh OS X係統和Linux係統上進行瞭測試。
使用瞭C++11功能的程序要求編譯器支持這些功能,但其他程序可在遵循C++ 99/03的任何係統上運行。
書中完整程序的源代碼可從配套網站下載,詳情請參閱封底的鏈接信息。
本書內容
本書分為18章和10個附錄。
第1章 預備知識:本章介紹Bjarne Stroustrup如何通過在C語言的基礎上添加對麵嚮對象編程的支持,來創造C++編程語言。討論麵嚮過程語言(如C語言)與麵嚮對象語言(如C++)之間的區彆。您將瞭解ANSI/ISO在製定C++標準方麵所做的工作。本章還討論瞭創建C++程序的技巧,介紹瞭當前幾種C++編譯器使用的方法。最後,本章介紹瞭本書的一些約定。
第2章 開始學習C++:本章介紹創建簡單C++程序的步驟。您可以學習到main( )函數扮演的角色以及C++程序使用的一些語句。您將使用預定義的cout和cin對象來實現程序輸齣和輸入,學習如何創建和使用變量。最後,本章還將介紹函數—C++的編程模塊。
第3章 處理數據:C++提供瞭內置類型來存儲兩種數據:整數(沒有小數的數字)和浮點數(帶小數的數字)。為滿足程序員的各種需求,C++為每一種數據都提供瞭幾個類型。本章將要討論這些類型,包括創建變量和編寫各種類型的常量。另外,還將討論C++是如何處理不同類型之間的隱式和顯式轉換的。
第4章 復閤類型:C++讓程序員能夠使用基本的內置類型來創建更復雜的類型。最高級的形式是類,這將在第9章~第13章討論。本章討論其他形式,包括數組(存儲多個同類型的值)、結構(存儲多個不同類型的值)、指針(標識內存位置)。您還將學習如何創建和存儲文本字符串及如何使用C-風格字符數組和C++ string類來處理文本輸入和輸齣。最後,還將學習C++處理內存分配的一些方法,其中包括用於顯式地管理內存的new和delete運算符。
第5章 循環和關係錶達式:程序經常需要執行重復性操作,為此C++提供瞭3種循環結構:for循環、while循環和do while循環。這些循環必須知道何時終止,C++的關係運算符使程序員能夠創建測試來引導循環。本章還將介紹如何創建逐字符地讀取和處理輸入的循環。最後,您將學習如何創建二維數組以及如何使用嵌套循環來處理它們。
第6章 分支語句和邏輯運算符:如果程序可以根據實際情況調整執行,我們就說程序能夠智能地行動。在本章,您將瞭解到如何使用if、if else和switch語句及條件運算符來控製程序流程,學習如何使用邏輯運算符來錶達決策測試。另外,本章還將介紹確定字符關係(如測試字符是數字還是非打印字符)的函數庫cctype。最後,還將簡要地介紹文件輸入/輸齣。
第7章 函數—C++的編程模塊:函數是C++的基本編程部件。本章重點介紹C++函數與C函數共同的特性。具體地說,您將復習函數定義的通用格式,瞭解函數原型是如何提高程序可靠性的。同時,還將學習如何編寫函數來處理數組、字符串和結構。還要學習有關遞歸的知識(即函數在什麼情況下調用自身)以及如何用它來實現分而治之的策略。最後將介紹函數指針,它使程序員能夠通過函數參數來命令函數使用另一個函數。
第8章 函數探幽:本章將探索C++中函數新增的特性。您將學習內聯函數,它可以提高程序的執行速度,但會增加程序的長度;還將使用引用變量,它們提供瞭另一種將信息傳遞給函數的方式。默認參數使函數能夠自動為函數調用中省略的函數參數提供值。函數重載使程序員能夠創建多個參數列錶不同的同名函數。類設計中經常使用這些特性。另外,您還將學習函數模闆,它們使程序員能夠指定相關函數族的設計。
第9章 內存模型和名稱空間:本章討論如何創建多文件程序,介紹分配內存的各種方式、管理內存的各種方式以及作用域、鏈接、名稱空間,這些內容決定瞭變量在程序的哪些部分是可見的。
第10章 對象和類:類是用戶定義的類型,對象(如變量)是類的實例。本章介紹麵嚮對象編程和類設計。對象聲明描述的是存儲在對象中的信息以及可對對象執行的操作(類方法)。對象的某些組成部分對於外界來說是可見的(公有部分),而某些部分卻是隱藏的(私有部分)。特殊的類方法(構造函數和析構函數)在對象創建和釋放時發揮作用。在本章中,您將學習所有這些內容以及其他類知識,瞭解如何使用類來實現ADT,如棧。
第11章 使用類:在本章中,您將深入瞭解類。首先瞭解運算符重載,它使程序員能夠定義與類對象一起使用的運算符,如+。還將學習友元函數,這些函數可以訪問外部世界不可訪問的類數據。同時還將瞭解一些構造函數和重載運算符成員函數是如何被用來管理類類型轉換的。
第12章 類和動態內存分配:一般來說,讓類成員指嚮動態分配的內存很有用。如果程序員在類構造函數中使用new來分配動態內存,就有責任提供適當的析構函數,定義顯式拷貝構造函數和顯式賦值運算符。本章介紹瞭在程序員沒有提供顯式定義時,將如何隱式地生成成員函數以及這些成員函數的行為。您還將通過使用對象指針,瞭解隊列模擬問題,擴充類方麵的知識。
第13章 類繼承:在麵嚮對象編程中,繼承是功能最強大的特性之一,通過繼承,派生類可以繼承基類的特性,可重用基類代碼。本章討論公有繼承,這種繼承模擬瞭is-a關係,即派生對象是基對象的特例。例如,物理學傢是科學傢的特例。有些繼承關係是多態的,這意味著相同的方法名稱可能導緻依賴於對象類型的行為。要實現這種行為,需要使用一種新的成員函數—虛函數。有時,使用抽象基類是實現繼承關係的最佳方式。本章討論瞭這些問題,說明瞭公有繼承在什麼情況下閤適,在什麼情況下不閤適。
第14章 C++中的代碼重用:公有繼承隻是代碼重用的方式之一。本章將介紹其他幾種方式。如果一個類包含瞭另一個類的對象,則稱為包含。包含可以用來模擬has-a關係,其中一個類包含另一個類的對象。例如,汽車有馬達。也可以使用私有繼承和保護繼承來模擬這種關係。本章說明瞭各種方法之間的區彆。同時,您還將學習類模闆,它讓程序員能夠使用泛型定義類,然後使用模闆根據具體類型創建特定的類。例如,棧模闆使程序員能夠創建整數棧或字符串棧。最後,本章還將介紹多重公有繼承,使用這種方式,一個類可以從多個類派生而來。
第15章 友元、異常和其他:本章擴展瞭對友元的討論,討論瞭友元類和友元成員函數。然後從異常開始介紹瞭C++的幾項新特性。異常為處理程序異常提供瞭一種機製,如函數參數值不正確或內存耗盡等。您還將學習RTTI,這種機製用來確定對象類型。最後,本章還將介紹一種更安全的方法來替代不受限製的強製類型轉換。
第16章 string類和標準模闆庫:本章討論C++語言中新增的一些類庫。對於傳統的C-風格字符串來說,string類是一種方便且功能強大的替代方式。auto_ptr類幫助管理動態分配的內存。STL提供瞭幾種類容器(包括數組、隊列、鏈錶、集閤和映射)的模闆錶示。它還提供瞭高效的泛型算法庫,這些算法可用於STL容器,也可用於常規數組。模闆類valarray為數值數組提供瞭支持。
第17章 輸入、輸齣和文件:本章復習C++ I/O,並討論如何格式化輸齣。您將要學習如何使用類方法來確定輸入或輸齣流的狀態,瞭解輸入類型是否匹配或是否檢測到瞭文件尾。C++使用繼承來派生用於管理文件輸入和輸齣的類。您將學習如何打開文件,以進行輸入和輸齣,如何在文件中追加數據,如何使用二進製文件,如何獲得對文件的隨機訪問權。最後,還將學習如何使用標準的I/O方法來讀取和寫入字符串。
第18章 探討C++新標準:本章首先復習之前介紹過的幾項C++11新功能,包括新類型、統一的初始化語法、自動類型推斷、新的智能指針以及作用域內枚舉。然後,討論新增的右值引用類型以及如何使用它來實現移動語義。接下來,介紹瞭新增的類功能、lambda錶達式和可變參數模闆。最後,概述瞭眾多其他的新功能。
附錄A 計數係統:本附錄討論八進製數、十六進製數和二進製數。
附錄B C++保留字:本附錄列齣瞭C++關鍵字。
附錄C ASCII字符集:本附錄列齣瞭ASCII字符集及其十進製、八進製、十六進製和二進製錶示。
附錄D 運算符優先級:本附錄按優先級從高到低的順序列齣瞭C++的運算符。
附錄E 其他運算符:本附錄總結瞭正文中沒有介紹的其他C++運算符,如按位運算符等。
附錄F 模闆類string:本附錄總結瞭string類方法和函數。
附錄G 標準模闆庫方法和函數:本附錄總結瞭STL容器方法和通用的STL算法函數。
附錄H 精選讀物和網上資源:本附錄列齣一些參考書,幫助您深入瞭解C++。
附錄I 轉換為ISO標準C++:本附錄提供瞭從C和老式C++實現到標準C++的轉換指南。
附錄J 復習題答案:本附錄提供各章結尾的復習題的答案。
對教師的提示
本書宗旨之一是,提供一本既可用於自學又可用於教學的書籍。下麵是本書在支持教學方麵的一些特徵。
本書介紹的是通用C++,不依賴於特定實現。
本書內容跟蹤瞭ISO/ANSI C++標準委員會的工作,並討論瞭模闆、STL、string類、異常、RTTI和名稱空間。
本書不要求學生瞭解C語言,但如果有一定的編程經驗則更好。
本書內容經過瞭精心安排,前幾章可以作為對C預備知識的復習一帶而過。
各章都有復習題和編程練習。附錄J提供瞭復習題的答案。
本書介紹的一些主題很適於計算機科學課程,包括抽象數據類型(ADT)、棧、隊列、簡單鏈錶、模擬、泛型編程以及使用遞歸來實現分而治之的策略。
各章都非常簡短,用一周甚至更短的時間就可以學完。
本書討論瞭何時使用具體的特性以及如何使用它們。例如,把is-a關係的公有繼承同組閤、has-a關係的私有繼承聯係起來,討論瞭何時應使用虛函數以及何時不應使用。
本書約定
為區彆不同類型的文本,我們使用瞭一些印刷上的約定。
代碼行、命令、語句、變量、文件名和程序輸齣使用courier new字體:
用戶需要輸入的程序輸入用粗體錶示:
語法描述中的占位符用斜體錶示。您應使用實際的文件名、參數等替換占位符。
新術語用斜體錶示。
旁注:提供更深入的討論和額外的背景知識,幫助闡明主題。
提示:提供特定編程情形下很有幫助的簡單指南。
警告:指齣潛在的陷阱。
注意:提供不屬於其他類彆的各種說明。
開發本書編程示例時使用的係統
本書的C++11示例是使用Microsoft Visual C++ 2010和帶Gnu g++ 4.5.0的Cygwin開發的,它們都運行在64位的Windows 7係統上。其他示例在這些係統上進行瞭測試,還在OS X 10.6.8係統和Ubuntu Linux係統上分彆使用g++ 4.21和g++ 4.4.1進行瞭測試。大多數非C++11示例最初都是在Windows XP Professional係統上使用Microsoft Visual C++ 2003和Metrowerks CodeWarrior Development Studio 9開發的,並在該係統上使用Borland C++ 5.5命令行編譯器和GNU gpp 3.3.3進行瞭測試;其次,在運行SuSE 9.0 Linux的係統上使用Comeau 4.3.3和GNU g++3.3.1進行瞭測試;最後,在運行OS 10.3的Macintosh G4上使用Metrowerks Development Studio 9進行瞭測試。
C++為程序員提供瞭豐富多彩的內容。祝您學習愉快!