商品簡介
名人/編輯推薦
目次
書摘/試閱
相關商品
商品簡介
《零基礎學C++(第2版)(附DVD光盤1張)》內容簡介:閱讀和學習《零基礎學C++(第2版)(附DVD光盤1張)》并不要求讀者有C++語言的基礎,通過幾百個簡潔高效的代碼,《零基礎學C++》將帶領讀者循序漸進地領略C++語言的魅力所在。本書采用從無到有、由淺入深、逐級遞進的編寫方式,尤其適合無C++語言基礎或C語言基礎薄弱的程序員閱讀。
《零基礎學C++(第2版)(附DVD光盤1張)》共分為六篇21章,介紹了Visual C++6開發環境的搭建、C++語言的基本數據類型、C++語言的表達式、函數、函數重載、類的繼承、多態、內存管理方式、文件存儲、錯誤與異常、RTTI、String類、編碼風格與程序編譯等內容,最後還對世界500強中IT公司常見面試題進行了講解。
《零基礎學C++》非常適合C++語言的初、中級學者閱讀,并可作為開發人員的參考手冊。
《零基礎學C++(第2版)(附DVD光盤1張)》共分為六篇21章,介紹了Visual C++6開發環境的搭建、C++語言的基本數據類型、C++語言的表達式、函數、函數重載、類的繼承、多態、內存管理方式、文件存儲、錯誤與異常、RTTI、String類、編碼風格與程序編譯等內容,最後還對世界500強中IT公司常見面試題進行了講解。
《零基礎學C++》非常適合C++語言的初、中級學者閱讀,并可作為開發人員的參考手冊。
名人/編輯推薦
《零基礎學C++(第2版)(附DVD光盤1張)》采用技術要點、詳細介紹、示例運行等多種方式進行講解、范例豐富,范例程序潔,內容全面,兼顧了C++幾乎所有特性;精選習題與面試題,緊扣職場。
目次
目錄:
前言
第一篇 C++基礎
第1章 C++概述 1
1.1 了解計算機 1
1.1.1 計算機硬件 2
1.1.2 計算機軟件 3
1.2 程序設計語言 3
1.2.1 機器語言 3
1.2.2 匯編語言 4
1.2.3 高級語言 5
1.2.4 數據結構和算法 6
1.2.5 面向過程的程序設計(POP) 6
1.2.6 面向對象的程序設計(OOP) 6
1.3 C++簡介 7
1.3.1 C++語言發展歷程 7
1.3.2 C++語言特點 8
1.3.3 C++程序開發基本過程 8
1.4 C++開發環境的搭建 9
1.4.1 Visual C++ 6開發環境簡介 9
1.4.2 開發步驟 10
1.5 第一個C++程序 11
1.6 小結 12
1.7 上機實踐習題 12
第2章 開始C++之旅 13
2.1 C++程序的結構 13
2.1.1 注釋 14
2.1.2 編譯預處理與新舊標準 14
2.1.3 主函數 14
2.1.4 名稱空間 16
2.1.5 C++語素 17
2.2 變量與基本類型 18
2.2.1 變量 18
2.2.2 整型 20
2.2.3 浮點型 21
2.2.4 基本字符型 21
2.2.5 寬字符型 22
2.2.6 布爾型 22
2.3 常量 22
2.3.1 整型常量和浮點型常量 23
2.3.2 字符型常量 23
2.3.3 字符串常量 25
2.3.4 符號常量 26
2.3.5 枚舉常量 27
2.4 運算符與表達式 28
2.4.1 算術運算 28
2.4.2 邏輯運算 30
2.4.3 短路表達式 30
2.4.4 關系運算 31
2.4.5 大有文章: 變量是否為“0” 31
2.4.6 條件運算 32
2.4.7 位運算 32
2.4.8 賦值運算 35
2.4.9 ++和-- 37
2.4.10 逗號表達式 38
2.4.11 sizeof運算符與sizeof表達式 38
2.4.12 運算符的優先級和結合性 38
2.5 類型轉換 40
2.5.1 賦值轉換 40
2.5.2 表達式中的轉換 43
2.5.3 強制類型轉換 44
2.5.4 函數調用和傳遞參數時的類型轉換 45
2.6 流程控制語句 45
2.6.1 if...else...選擇結構 45
2.6.2 switch結構 47
2.6.3 if...else...結構和switch結構的比較 51
2.6.4 for循環結構 51
2.6.5 for循環結構嵌套 53
2.6.6 while循環結構 54
2.6.7 do...while循環結構 54
2.6.8 循環語句的效率 55
2.6.9 流程轉向控制語句之break 55
2.6.10 流程轉向控制語句之continue 56
2.6.11 自由轉向語句goto 56
2.6.12 程序中止函數exit() 57
2.7 小結 58
2.8 上機實踐習題 58
第二篇 C++過程開發
第3章 數組和C風格字符串 61
3.1 什么是數組 61
3.2 一維數組 62
3.2.1 一維數組的聲明 62
3.2.2 初始化一維數組 63
3.2.3 一維數組應用舉例 64
3.2.4 數組操作注意事項 65
3.3 C 風格字符串 65
3.3.1 C 風格字符串的聲明 65
3.3.2 字符數組的cin和cout 66
3.3.3 get()函數和getline()函數 67
3.3.4 cin與get()/getline()函數的搭配問題 68
3.3.5 訪問C風格字符串中的某個元素 69
3.3.6 C風格字符串處理函數 69
3.4 多維數組 71
3.4.1 聲明一個多維數組 71
3.4.2 初始化多維數組 72
3.4.3 多維數組應用舉例 72
3.4.4 多維數組在內存中是如何排列元素的 73
3.5 小結 74
3.6 上機實踐習題 74
第4章 指針和引用 76
4.1 指針的定義與使用 76
4.1.1 聲明一個指針變量 76
4.1.2 初始化指針變量 79
4.1.3 指向指針的指針 80
4.1.4 指針賦值 80
4.2 指針的運算 81
4.2.1 指針與整數的加減 81
4.2.2 同類型指針間的比較 82
4.2.3 同類型指針相減 82
4.3 動態內存分配 83
4.3.1 使用new動態分配內存 83
4.3.2 使用delete動態釋放及動態申請的內存 83
4.3.3 使用new申請動態數組 83
4.3.4 不要使用或釋放已經釋放的內存塊 85
4.3.5 使用malloc和free動態申請內存 85
4.3.6 動態內存申請并不一定能成功 87
4.4 指針和const 87
4.4.1 禁止改寫指針(常量指針或常指針) 87
4.4.2 禁止改寫間接引用 88
4.4.3 既禁止改寫指針,又禁止改寫間接引用 88
4.5 指針與數組 88
4.5.1 數組名指針 88
4.5.2 數組元素的指針形式 90
4.5.3 指向數組的指針 90
4.5.4 指針數組 92
4.6 引用 95
4.6.1 引用的聲明 95
4.6.2 引用的特點 95
4.6.3 引用的使用限制 96
4.6.4 其他要說明的問題 97
4.7 小結 97
4.8 上機實踐習題 98
第5章 結構、共用體和鏈表 99
5.1 結構 99
5.1.1 如何定義一個結構 99
5.1.2 結構變量的聲明和使用 100
5.1.3 結構變量的初始化 102
5.1.4 結構變量間是否可以相互賦值 102
5.1.5 結構體變量的sizeof 103
5.2 共用體 105
5.2.1 共用體的定義 105
5.2.2 共用體和結構的區別 105
5.2.3 共用體變量的聲明和初始化 107
5.2.4 共用體使用舉例 107
5.2.5 共用體的sizeof 109
5.3 結構數組和共用體數組 109
5.3.1 結構數組的聲明和初始化 109
5.3.2 共用體數組的聲明和初始化 110
5.4 指向結構的指針 111
5.4.1 聲明一個結構指針 111
5.4.2 結構指針的初始化 112
5.4.3 使用指針訪問結構成員 114
5.5 鏈表 114
5.5.1 鏈表的結構 115
5.5.2 創建鏈表 115
5.5.3 鏈表與數組的區別 116
5.5.4 鏈表的遍歷和查找 116
5.5.5 鏈表的插入和刪除 118
5.6 小結 121
5.7 上機實踐習題 122
第6章 用函數合理組織程序 124
6.1 模塊化帶來的好處 124
6.1.1 函數的調用過程 124
6.1.2 抽象和封裝 125
6.1.3 實現一個函數 126
6.2 函數定義 126
6.2.1 函數頭 127
6.2.2 函數體 127
6.2.3 函數定義補充說明 128
6.3 函數聲明 129
6.3.1 為什么要進行函數聲明 129
6.3.2 如何聲明一個函數 130
6.3.3 分割程序文件 131
6.4 函數調用 132
6.4.1 形參和實參 133
6.4.2 參數類型轉換 133
6.4.3 值傳遞 134
6.4.4 指針傳遞 135
6.4.5 引用傳遞 136
6.4.6 對3種傳遞的補充 137
6.4.7 默認參數調用 138
6.4.8 inline函數 140
6.5 遞歸 141
6.6 函數的重載 143
6.6.1 何時使用函數重載 144
6.6.2 如何實現函數重載 144
6.6.3 陷阱:隱式轉換導致重載函數出現二義性 144
6.7 C++如何使用內存 145
6.7.1 自動存儲(棧存儲) 145
6.7.2 靜態存儲(編譯器預分配) 148
6.8 作用域與可見域 152
6.8.1 作用域 153
6.8.2 可見域 153
6.8.3 函數的作用域和可見域 156
6.9 小結 156
6.10 上機實踐習題 157
第7章 關于函數的高級專題 158
7.1 內存使用錯誤剖析 158
7.1.1 內存泄露 158
7.1.2 野指針 159
7.1.3 試圖修改常量 160
7.1.4 用錯sizeof 161
7.1.5 內存越界訪問 161
7.1.6 變量的初始化 162
7.2 重申:函數參數傳遞和返回機制 162
7.2.1 參數傳遞時的“副本” 162
7.2.2 函數返回時的“副本” 164
7.3 函數與指針 165
7.3.1 指向函數的指針 165
7.3.2 typedef 167
7.3.3 通過函數指針將函數作為另一個函數的參數 168
7.3.4 函數指針數組 169
7.3.5 返回函數指針的函數 171
7.3.6 帶參主函數 171
7.4 函數與數組 172
7.4.1 數組名作為函數參數 172
7.4.2 通過指針得到多于1個的回傳值 175
7.5 函數與結構體、共用體及類對象 176
7.5.1 3種參數調用 176
7.5.2 3種返回機制 177
7.6 函數編寫的建議 177
7.6.1 合理使用const 177
7.6.2 檢查輸入參數的有效性 178
7.6.3 函數返回類型的判斷 179
7.7 小結 179
7.8 上機實踐習題 179
第三篇 面向對象的C++
第8章 面向對象技術基礎 181
8.1 面向對象基本概念 181
8.1.1 類的概念 182
8.1.2 類是分層的 182
8.1.3 類和對象的關系 183
8.2 C++類的定義 183
8.2.1 類定義的基本形式 183
8.2.2 類定義示例 184
8.2.3 class和struct 185
8.3 C++類的實現 185
8.3.1 在類定義時定義成員函數 185
8.3.2 在類定義的外部定義成員函數 186
8.4 C++類的使用 187
8.4.1 聲明一個對象 188
8.4.2 對象的作用域、可見域和生存期 189
8.5 對象的創建和撤銷 189
8.5.1 構造函數的作用 189
8.5.2 構造函數可以有參數 190
8.5.3 構造函數支持重載 191
8.5.4 構造函數允許按參數默認方式調用 192
8.5.5 初始化表達式 192
8.5.6 析構函數 194
8.5.7 顯式調用析構函數 195
8.6 復制構造函數 196
8.6.1 復制構造函數調用機制 196
8.6.2 默認復制構造函數帶來的問題 198
8.6.3 解決方案—顯式定義復制構造函數 199
8.6.4 關于構造函數和復制構造函數 201
8.7 特殊數據成員 202
8.7.1 const數據成員 202
8.7.2 引用成員 204
8.7.3 類對象成員 206
8.7.4 特別說明 210
8.7.5 static數據成員 210
8.8 特殊函數成員 212
8.8.1 靜態成員函數 212
8.8.2 const與成員函數 214
8.9 對象的組織 215
8.9.1 const對象 215
8.9.2 指向對象的指針 217
8.9.3 對象的大小 218
8.9.4 this指針 219
8.9.5 對象數組 220
8.9.6 對象鏈表 221
8.10 為對象動態分配內存 221
8.10.1 使用new和delete為單個對象分配/釋放動態內存 221
8.10.2 使用new和delete為對象數組分配/釋放動態空間 222
8.10.3 malloc和free能否為對象動態申請內存 224
8.11 小結 224
8.12 上機實踐習題 225
第9章 關于對象的高級專題 227
9.1 類的作用域 227
9.2 類定義的作用域與可見域 229
9.3 對象的生存期、作用域和可見域 232
9.3.1 先定義,後實例化 232
9.3.2 對象內存的釋放與堆內存 232
9.4 友元 232
9.4.1 友元的非成員函數 233
9.4.2 友元的成員函數 234
9.4.3 友元函數的重載 236
9.4.4 友元類 236
9.4.5 友元是否破壞了封裝性 237
9.5 運算符重載 238
9.5.1 運算符重載規則 238
9.5.2 以成員函數形式重載運算符 239
9.5.3 以友元函數形式重載運算符 242
9.5.4 友元函數形式和成員函數形式的比較 245
9.5.5 對運算符重載的補充說明 246
9.6 運算符重載范例 247
9.6.1 賦值運算符 247
9.6.2 函數調用運算符 250
9.6.3 下標運算符 251
9.7 類型轉換 253
9.7.1 由其他類型向定義類的轉換 253
9.7.2 由自定義類向其他類型的轉換 255
9.7.3 隱式轉換帶來的二義性 257
9.8 重載函數選擇規則 257
9.8.1 重載解析 258
9.8.2 什么是完全匹配 258
9.9 小結 259
9.10 上機實踐習題 259
第10章 繼承 262
10.1 什么是繼承 262
10.1.1 簡單示例 262
10.1.2 繼承的層次性 264
10.2 派生類 264
10.2.1 public派生與private派生 264
10.2.2 protected成員與protected派生 265
10.3 多基派生 266
10.3.1 多基派生的聲明和定義 266
10.3.2 二義性問題 267
10.3.3 解決方案 268
10.4 虛基類 268
10.4.1 共同基類帶來的二義性 268
10.4.2 解決方案 270
10.4.3 虛基派生二義性與多基派生二義性不同 271
10.5 派生類的構造函數和析構函數 271
10.5.1 派生類的構造函數 271
10.5.2 派生類的析構函數 273
10.5.3 多基派生類的構造函數和析構函數 275
10.5.4 虛基派生類的構造函數和析構函數 275
10.6 分清繼承還是組合 278
10.6.1 繼承不是萬金油 278
10.6.2 組合 278
10.7 基類與派生類對象間的相互轉換 280
10.7.1 類型適應 280
10.7.2 多基繼承時的情況 282
10.7.3 公共基類 282
10.7.4 虛基類的情況 284
10.8 小結 284
10.9 上機實踐習題 285
第11章 多態 287
11.1 多態與虛函數 287
11.1.1 靜態聯編 287
11.1.2 動態聯編 287
11.1.3 為什么需要虛函數 287
11.1.4 虛函數的聲明和定義 290
11.2 虛函數的訪問 290
11.2.1 對象名訪問 291
11.2.2 指針訪問 292
11.2.3 引用訪問 292
11.2.4 類內訪問 293
11.2.5 在構造函數或析構函數中進行訪問 294
11.3 純虛函數與抽象類 295
11.3.1 純虛函數的聲明和定義 295
11.3.2 抽象類 296
11.3.3 另一種抽象類:類中只定義了protected型的構造函數 299
11.3.4 延伸:構造函數能否為private型 301
11.3.5 虛析構函數 302
11.4 虛函數引入的二義性 305
11.4.1 多基派生 305
11.4.2 共同基類和虛繼承 307
11.5 重載、覆蓋與隱藏 309
11.5.1 重載 309
11.5.2 覆蓋 309
11.5.3 隱藏 310
11.6 小結 311
11.7 上機實踐習題 312
第四篇 泛 型 編 程
第12章 模板 315
12.1 為什么要定義模板 315
12.1.1 類型參數化 315
12.1.2 模板的定義 317
12.2 函數模板 318
12.2.1 函數模板的使用 318
12.2.2 隱式實例化 318
12.2.3 顯式實例化 320
12.2.4 特化 321
12.2.5 重載 322
12.2.6 優先級與執行順序 322
12.3 類模板 324
12.3.1 定義類模板 324
12.3.2 隱式實例化 326
12.3.3 顯式實例化 326
12.3.4 顯式特化 327
12.3.5 部分特化 328
12.3.6 重載和優先級 328
12.4 模板的嵌套 329
12.4.1 函數成員模板 329
12.4.2 對象成員模板 330
12.5 模板參數 331
12.6 小結 332
12.7 上機實踐習題 333
第13章 標準模板庫 335
13.1 理解STL 335
13.1.1 容器 335
13.1.2 適配器 336
13.1.3 迭代器 336
13.1.4 算法 336
13.2 使用序列式容器 336
13.2.1 序列式容器的創建和元素的訪問 336
13.2.2 所有容器都支持的特征 338
13.2.3 序列式容器中元素的插入和刪除 339
13.2.4 vector容器 344
13.2.5 deque容器 344
13.2.6 list容器 344
13.3 使用關聯式容器 344
13.3.1 set容器 345
13.3.2 multiset容器 346
13.3.3 map容器 346
13.3.4 multimap容器 348
13.4 關聯式容器支持的成員函數操作 349
13.4.1 元素的插入 349
13.4.2 元素的刪除 352
13.4.3 元素的查找與訪問 354
13.5 迭代器 355
13.5.1 理解迭代器本質 355
13.5.2 迭代器類型 355
13.5.3 為什么要定義這么多迭代器 357
13.5.4 容器中定義的迭代器類型與5種類型的對應 358
13.5.5 流迭代器 358
13.5.6 迭代器失效 360
13.6 泛型算法 360
13.6.1 什么是函數對象 360
13.6.2 算法分類 361
13.7 適配器 365
13.7.1 容器適配器 366
13.7.2 迭代器適配器 367
13.7.3 函數適配器 369
13.8 小結 371
13.9 上機實踐習題 371
第五篇 輸入輸出處理和編程規范
第14章 輸入輸出和文件 373
14.1 輸入輸出概述 373
14.1.1 什么是文件 374
14.1.2 流 374
14.1.3 緩沖區 375
14.1.4 重定向 375
14.1.5 3種輸入輸出機制 376
14.2 高層I/O 377
14.2.1 標準輸出函數printf 377
14.2.2 標準輸入函數scanf 381
14.2.3 掃描集 384
14.2.4 sprintf函數和sscanf函數 385
14.2.5 fprintf函數和fscanf函數 386
14.2.6 文件訪問機制 386
14.3 流類庫 390
14.3.1 流類庫更安全、更高效 390
14.3.2 流類庫層次 390
14.4 輸出流 394
14.4.1 操作符<< 394
14.4.2 其他ostream方法 395
14.4.3 格式狀態字 397
14.4.4 格式控制值的默認值 398
14.4.5 flag函數讀取和設定格式狀態字 398
14.4.6 使用setf函數和unsetf函數設定格式關鍵字 400
14.4.7 設置域寬 402
14.4.8 填充字符 404
14.4.9 浮點數輸出和顯示精度 404
14.4.10 控制符 406
14.5 輸入流 408
14.5.1 >>操作符 408
14.5.2 輸入流與格式狀態字 408
14.5.3 輸入流與域寬 410
14.5.4 使用get函數讀取單個字符 411
14.5.5 使用get函數和getline函數讀取C風格字符串 413
14.5.6 其他istream方法 415
14.6 流狀態 417
14.6.1 什么是流狀態 417
14.6.2 讀取流狀態 417
14.6.3 管理流狀態 418
14.7 重載>>和<< 420
14.7.1 插入符的重載 420
14.7.2 抽取符的重載 422
14.8 文件操作 423
14.8.1 文件操作基本過程 423
14.8.2 文件的打開 423
14.8.3 取消文件和流的關聯 425
14.8.4 文件的讀寫 426
14.8.5 文本文件的讀寫 427
14.8.6 二進制文件的讀寫 428
14.8.7 文件定位指針和隨機讀取 429
14.9 字符串流 431
14.9.1 strstream類族 431
14.9.2 sstream類族 434
14.10 小結 437
14.11 上機實踐習題 437
第15章 名稱空間 439
15.1 什么是名稱空間 439
15.1.1 名稱空間范例 439
15.1.2 定義名稱空間 440
15.2 實體的作用域與可見域 441
15.2.1 實體可見域 442
15.2.2 可見域的擴展 442
15.2.3 using聲明機制 443
15.2.4 using聲明帶來的多重聲明問題(二義性) 445
15.2.5 空間內的屏蔽 445
15.2.6 先聲明,後使用 446
15.3 名稱空間的作用域與可見性 447
15.3.1 名稱空間的定義策略 447
15.3.2 推薦用法 450
15.3.3 名稱空間嵌套 451
15.3.4 using編譯指令 452
15.3.5 未命名的名稱空間 453
15.4 對名稱空間的思考 454
15.5 小結 454
15.6 上機實踐習題 454
第16章 異常和錯誤 456
16.1 編碼時的防錯 456
16.1.1 調用abort函數或exit函數 456
16.1.2 返回錯誤標志 457
16.2 異常機制 458
16.2.1 關鍵字throw 460
16.2.2 異常處理程序 460
16.2.3 自定義異常對象 463
16.2.4 有繼承關系的類異常 464
16.2.5 terminate函數和set_terminate函數 466
16.2.6 unexpected函數與set_unexpected函數 467
16.2.7 標準異常 468
16.2.8 對unexpected函數的補充 470
16.3 異常發生時的內存管理 471
16.3.1 堆棧解退 471
16.3.2 異常處理機制與函數的不同 472
16.3.3 構造函數中拋出異常 473
16.3.4 內存泄露 474
16.3.5 析構函數中可否拋出異常 475
16.4 auto_ptr類 476
16.4.1 使用auto_ptr類模板 477
16.4.2 關于auto_ptr的若干問題 477
16.5 小結 478
16.6 上機實踐習題 479
第17章 RTTI和類型轉換操作符 481
17.1 RTTI機制 481
17.1.1 dynamic_cast操作符 482
17.1.2 typeinfo類和typeid操作符 483
17.1.3 補充說明 484
17.2 類型轉換操作符 484
17.2.1 const_cast操作符 484
17.2.2 static_cast操作符 485
17.2.3 reinterpret_cast操作符 486
17.3 小結 486
17.4 上機實踐習題 487
第18章 string字符串類 489
18.1 為什么要使用string類 489
18.2 聲明一個字符串 489
18.3 字符串的輸入輸出 491
18.4 string類功能 492
18.4.1 string字符串和C風格字符串的轉換 492
18.4.2 賦值和清空 492
18.4.3 元素刪除 493
18.4.4 元素追加與相加 493
18.4.5 元素插入 494
18.4.6 大小和容量 494
18.4.7 元素存取 494
18.4.8 字符串比較 495
18.4.9 提取子串 495
18.4.10 搜索與查找 495
18.5 小結 496
18.6 上機實踐習題 496
第19章 編碼風格 497
19.1 程序的排版 497
19.1.1 注釋 497
19.1.2 空行的用法 498
19.1.3 代碼行 498
19.1.4 空格 498
19.1.5 縮進與對齊 499
19.1.6 &和*的位置 499
19.2 命名規則 499
19.2.1 Windows風格和Unix風格 500
19.2.2 如何對程序實體命名 500
19.3 項目文件的組織 500
19.3.1 模塊劃分 500
19.3.2 頭文件 500
19.3.3 定義文件 501
19.3.4 目錄結構 501
19.4 小結 501
19.5 上機實踐習題 502
第20章 程序編譯 503
20.1 程序的編譯流程 503
20.2 預處理 504
20.2.1 頭文件包含 505
20.2.2 宏 505
20.2.3 條件編譯 506
20.2.4 #ifdef、 #ifndef與重復包含 507
20.2.5 使用const代替#define定義常量 508
20.2.6 inline與#define的比較 509
20.3 VC6調試入門 509
20.3.1 斷點的設置與去除 509
20.3.2 條件斷點 510
20.3.3 數據斷點 510
20.3.4 消息斷點 511
20.3.5 觀察視圖(Watch) 511
20.3.6 內存視圖(Memory) 511
20.3.7 變量視圖(Variables) 511
20.3.8 寄存器視圖(Registers) 511
20.3.9 調用堆棧視圖(Call Stack) 512
20.3.10 反匯編視圖(Disassembly) 512
20.3.11 進程控制 512
20.4 其他調試手段 512
20.4.1 Debug模式和Release模式 512
20.4.2 assert宏 512
20.4.3 輸出字符串 513
20.5 小結 513
20.6 上機實踐習題 513
第六篇 面試題精選
第21章 常見面試題 517
21.1 常見基本知識問答題 517
面試題1:簡述面向對象的3個基本特征 517
面試題2:局部變量能否和全局變量重名 517
面試題3:類成員函數的重載、覆蓋和隱藏的區別是什么 518
面試題4:用變量a給出下面的定義 518
面試題5:在C++中,下面的結構是合法的嗎?如果是,其作用是什么 519
面試題6:在非C++中建類 A 和 B,在哪幾種情況下B能隱式轉化為A 519
面試題7:C++中的空類,默認產生哪些類成員函數 519
面試題8:C++有哪些性質(面向對象特點) 519
面試題9:子類析構時要調用父類的析構函數嗎 520
面試題10:什么是引用?聲明和使用“引用”要注意哪些問題 520
面試題11:將引用作為函數返回值類型的格式及優點有哪些 520
面試題12:引用與指針的區別是什么 520
面試題13:重載和重寫(覆蓋)的區別 520
面試題14:多態的作用是什么 520
面試題15:請指出const與#define相比有何優點 521
面試題16:C語言中static關鍵字的具體作用有哪些 521
面試題17:如何判斷程序是由C 編譯程序還是由C++編譯程序編譯的 521
面試題18:關鍵字const的含義是什么 521
21.2 世界500強公司的智力問答題 522
面試題19:工人分金條 522
面試題20:分蛋糕 522
面試題21:過橋問題 522
面試題22:黑白帽子 523
面試題23:電梯與鉆石 523
面試題24:手電筒傳遞 523
面試題25:燒繩問題 524
面試題26:圓的下水道蓋子 524
面試題27:選建筑師 524
面試題28:天平分鹽 524
面試題29:分不開的錢 524
面試題30:小鳥追火車 525
面試題31:給紅色最大的機會 525
面試題32:鏡子中的影像 525
面試題33:污染的藥丸 525
面試題34:稱出不是標準重量的水 525
面試題35:多彩的果凍 526
面試題36:電子游戲機 526
面試題37:監獄里的囚犯 526
面試題38:燈的狀態 526
面試題39:時針和分針 527
面試題40:3個奇數 527
面試題41:屋內的燈 527
面試題42:找出最重的球 528
面試題43:盲人分襪子 528
面試題44:燒香計時 528
面試題45:平分蜂蜜 528
面試題46:猜經理女兒的年齡 528
面試題47:兩個圓環 529
面試題48:喝啤酒 529
面試題49:算24點 529
面試題50:聰明人 529
面試題51:海盜分金幣 529
面試題52:到底是什么牌 530
面試題53:聰明的老板娘 531
面試題54:找出不同重量的球 531
21.3 分析題 532
面試題55:分析下面的程序段,顯示最後的結果 532
面試題56:分析程序最後的輸出結果 532
面試題57:分析最後輸出的結果 533
面試題58:求下面函數的返回值 533
面試題59:分析最後輸出的結果 534
面試題60:分析最後輸出的結果 535
21.4 編程題 536
面試題61:結果輸出到文件 536
面試題62:String類的具體實現 537
面試題63:鏈表題,一個鏈表的節點結構 538
面試題64:寫一個函數并找出在一個整數數組中第二大的數 540
面試題65:字符串的逆序輸出 541
面試題66:判斷操作系統的位數 541
面試題67:實現對數組的降序排序 542
面試題68:斐波那契數列1、1、2、3、5等,編寫程序求第10項 543
前言
第一篇 C++基礎
第1章 C++概述 1
1.1 了解計算機 1
1.1.1 計算機硬件 2
1.1.2 計算機軟件 3
1.2 程序設計語言 3
1.2.1 機器語言 3
1.2.2 匯編語言 4
1.2.3 高級語言 5
1.2.4 數據結構和算法 6
1.2.5 面向過程的程序設計(POP) 6
1.2.6 面向對象的程序設計(OOP) 6
1.3 C++簡介 7
1.3.1 C++語言發展歷程 7
1.3.2 C++語言特點 8
1.3.3 C++程序開發基本過程 8
1.4 C++開發環境的搭建 9
1.4.1 Visual C++ 6開發環境簡介 9
1.4.2 開發步驟 10
1.5 第一個C++程序 11
1.6 小結 12
1.7 上機實踐習題 12
第2章 開始C++之旅 13
2.1 C++程序的結構 13
2.1.1 注釋 14
2.1.2 編譯預處理與新舊標準 14
2.1.3 主函數 14
2.1.4 名稱空間 16
2.1.5 C++語素 17
2.2 變量與基本類型 18
2.2.1 變量 18
2.2.2 整型 20
2.2.3 浮點型 21
2.2.4 基本字符型 21
2.2.5 寬字符型 22
2.2.6 布爾型 22
2.3 常量 22
2.3.1 整型常量和浮點型常量 23
2.3.2 字符型常量 23
2.3.3 字符串常量 25
2.3.4 符號常量 26
2.3.5 枚舉常量 27
2.4 運算符與表達式 28
2.4.1 算術運算 28
2.4.2 邏輯運算 30
2.4.3 短路表達式 30
2.4.4 關系運算 31
2.4.5 大有文章: 變量是否為“0” 31
2.4.6 條件運算 32
2.4.7 位運算 32
2.4.8 賦值運算 35
2.4.9 ++和-- 37
2.4.10 逗號表達式 38
2.4.11 sizeof運算符與sizeof表達式 38
2.4.12 運算符的優先級和結合性 38
2.5 類型轉換 40
2.5.1 賦值轉換 40
2.5.2 表達式中的轉換 43
2.5.3 強制類型轉換 44
2.5.4 函數調用和傳遞參數時的類型轉換 45
2.6 流程控制語句 45
2.6.1 if...else...選擇結構 45
2.6.2 switch結構 47
2.6.3 if...else...結構和switch結構的比較 51
2.6.4 for循環結構 51
2.6.5 for循環結構嵌套 53
2.6.6 while循環結構 54
2.6.7 do...while循環結構 54
2.6.8 循環語句的效率 55
2.6.9 流程轉向控制語句之break 55
2.6.10 流程轉向控制語句之continue 56
2.6.11 自由轉向語句goto 56
2.6.12 程序中止函數exit() 57
2.7 小結 58
2.8 上機實踐習題 58
第二篇 C++過程開發
第3章 數組和C風格字符串 61
3.1 什么是數組 61
3.2 一維數組 62
3.2.1 一維數組的聲明 62
3.2.2 初始化一維數組 63
3.2.3 一維數組應用舉例 64
3.2.4 數組操作注意事項 65
3.3 C 風格字符串 65
3.3.1 C 風格字符串的聲明 65
3.3.2 字符數組的cin和cout 66
3.3.3 get()函數和getline()函數 67
3.3.4 cin與get()/getline()函數的搭配問題 68
3.3.5 訪問C風格字符串中的某個元素 69
3.3.6 C風格字符串處理函數 69
3.4 多維數組 71
3.4.1 聲明一個多維數組 71
3.4.2 初始化多維數組 72
3.4.3 多維數組應用舉例 72
3.4.4 多維數組在內存中是如何排列元素的 73
3.5 小結 74
3.6 上機實踐習題 74
第4章 指針和引用 76
4.1 指針的定義與使用 76
4.1.1 聲明一個指針變量 76
4.1.2 初始化指針變量 79
4.1.3 指向指針的指針 80
4.1.4 指針賦值 80
4.2 指針的運算 81
4.2.1 指針與整數的加減 81
4.2.2 同類型指針間的比較 82
4.2.3 同類型指針相減 82
4.3 動態內存分配 83
4.3.1 使用new動態分配內存 83
4.3.2 使用delete動態釋放及動態申請的內存 83
4.3.3 使用new申請動態數組 83
4.3.4 不要使用或釋放已經釋放的內存塊 85
4.3.5 使用malloc和free動態申請內存 85
4.3.6 動態內存申請并不一定能成功 87
4.4 指針和const 87
4.4.1 禁止改寫指針(常量指針或常指針) 87
4.4.2 禁止改寫間接引用 88
4.4.3 既禁止改寫指針,又禁止改寫間接引用 88
4.5 指針與數組 88
4.5.1 數組名指針 88
4.5.2 數組元素的指針形式 90
4.5.3 指向數組的指針 90
4.5.4 指針數組 92
4.6 引用 95
4.6.1 引用的聲明 95
4.6.2 引用的特點 95
4.6.3 引用的使用限制 96
4.6.4 其他要說明的問題 97
4.7 小結 97
4.8 上機實踐習題 98
第5章 結構、共用體和鏈表 99
5.1 結構 99
5.1.1 如何定義一個結構 99
5.1.2 結構變量的聲明和使用 100
5.1.3 結構變量的初始化 102
5.1.4 結構變量間是否可以相互賦值 102
5.1.5 結構體變量的sizeof 103
5.2 共用體 105
5.2.1 共用體的定義 105
5.2.2 共用體和結構的區別 105
5.2.3 共用體變量的聲明和初始化 107
5.2.4 共用體使用舉例 107
5.2.5 共用體的sizeof 109
5.3 結構數組和共用體數組 109
5.3.1 結構數組的聲明和初始化 109
5.3.2 共用體數組的聲明和初始化 110
5.4 指向結構的指針 111
5.4.1 聲明一個結構指針 111
5.4.2 結構指針的初始化 112
5.4.3 使用指針訪問結構成員 114
5.5 鏈表 114
5.5.1 鏈表的結構 115
5.5.2 創建鏈表 115
5.5.3 鏈表與數組的區別 116
5.5.4 鏈表的遍歷和查找 116
5.5.5 鏈表的插入和刪除 118
5.6 小結 121
5.7 上機實踐習題 122
第6章 用函數合理組織程序 124
6.1 模塊化帶來的好處 124
6.1.1 函數的調用過程 124
6.1.2 抽象和封裝 125
6.1.3 實現一個函數 126
6.2 函數定義 126
6.2.1 函數頭 127
6.2.2 函數體 127
6.2.3 函數定義補充說明 128
6.3 函數聲明 129
6.3.1 為什么要進行函數聲明 129
6.3.2 如何聲明一個函數 130
6.3.3 分割程序文件 131
6.4 函數調用 132
6.4.1 形參和實參 133
6.4.2 參數類型轉換 133
6.4.3 值傳遞 134
6.4.4 指針傳遞 135
6.4.5 引用傳遞 136
6.4.6 對3種傳遞的補充 137
6.4.7 默認參數調用 138
6.4.8 inline函數 140
6.5 遞歸 141
6.6 函數的重載 143
6.6.1 何時使用函數重載 144
6.6.2 如何實現函數重載 144
6.6.3 陷阱:隱式轉換導致重載函數出現二義性 144
6.7 C++如何使用內存 145
6.7.1 自動存儲(棧存儲) 145
6.7.2 靜態存儲(編譯器預分配) 148
6.8 作用域與可見域 152
6.8.1 作用域 153
6.8.2 可見域 153
6.8.3 函數的作用域和可見域 156
6.9 小結 156
6.10 上機實踐習題 157
第7章 關于函數的高級專題 158
7.1 內存使用錯誤剖析 158
7.1.1 內存泄露 158
7.1.2 野指針 159
7.1.3 試圖修改常量 160
7.1.4 用錯sizeof 161
7.1.5 內存越界訪問 161
7.1.6 變量的初始化 162
7.2 重申:函數參數傳遞和返回機制 162
7.2.1 參數傳遞時的“副本” 162
7.2.2 函數返回時的“副本” 164
7.3 函數與指針 165
7.3.1 指向函數的指針 165
7.3.2 typedef 167
7.3.3 通過函數指針將函數作為另一個函數的參數 168
7.3.4 函數指針數組 169
7.3.5 返回函數指針的函數 171
7.3.6 帶參主函數 171
7.4 函數與數組 172
7.4.1 數組名作為函數參數 172
7.4.2 通過指針得到多于1個的回傳值 175
7.5 函數與結構體、共用體及類對象 176
7.5.1 3種參數調用 176
7.5.2 3種返回機制 177
7.6 函數編寫的建議 177
7.6.1 合理使用const 177
7.6.2 檢查輸入參數的有效性 178
7.6.3 函數返回類型的判斷 179
7.7 小結 179
7.8 上機實踐習題 179
第三篇 面向對象的C++
第8章 面向對象技術基礎 181
8.1 面向對象基本概念 181
8.1.1 類的概念 182
8.1.2 類是分層的 182
8.1.3 類和對象的關系 183
8.2 C++類的定義 183
8.2.1 類定義的基本形式 183
8.2.2 類定義示例 184
8.2.3 class和struct 185
8.3 C++類的實現 185
8.3.1 在類定義時定義成員函數 185
8.3.2 在類定義的外部定義成員函數 186
8.4 C++類的使用 187
8.4.1 聲明一個對象 188
8.4.2 對象的作用域、可見域和生存期 189
8.5 對象的創建和撤銷 189
8.5.1 構造函數的作用 189
8.5.2 構造函數可以有參數 190
8.5.3 構造函數支持重載 191
8.5.4 構造函數允許按參數默認方式調用 192
8.5.5 初始化表達式 192
8.5.6 析構函數 194
8.5.7 顯式調用析構函數 195
8.6 復制構造函數 196
8.6.1 復制構造函數調用機制 196
8.6.2 默認復制構造函數帶來的問題 198
8.6.3 解決方案—顯式定義復制構造函數 199
8.6.4 關于構造函數和復制構造函數 201
8.7 特殊數據成員 202
8.7.1 const數據成員 202
8.7.2 引用成員 204
8.7.3 類對象成員 206
8.7.4 特別說明 210
8.7.5 static數據成員 210
8.8 特殊函數成員 212
8.8.1 靜態成員函數 212
8.8.2 const與成員函數 214
8.9 對象的組織 215
8.9.1 const對象 215
8.9.2 指向對象的指針 217
8.9.3 對象的大小 218
8.9.4 this指針 219
8.9.5 對象數組 220
8.9.6 對象鏈表 221
8.10 為對象動態分配內存 221
8.10.1 使用new和delete為單個對象分配/釋放動態內存 221
8.10.2 使用new和delete為對象數組分配/釋放動態空間 222
8.10.3 malloc和free能否為對象動態申請內存 224
8.11 小結 224
8.12 上機實踐習題 225
第9章 關于對象的高級專題 227
9.1 類的作用域 227
9.2 類定義的作用域與可見域 229
9.3 對象的生存期、作用域和可見域 232
9.3.1 先定義,後實例化 232
9.3.2 對象內存的釋放與堆內存 232
9.4 友元 232
9.4.1 友元的非成員函數 233
9.4.2 友元的成員函數 234
9.4.3 友元函數的重載 236
9.4.4 友元類 236
9.4.5 友元是否破壞了封裝性 237
9.5 運算符重載 238
9.5.1 運算符重載規則 238
9.5.2 以成員函數形式重載運算符 239
9.5.3 以友元函數形式重載運算符 242
9.5.4 友元函數形式和成員函數形式的比較 245
9.5.5 對運算符重載的補充說明 246
9.6 運算符重載范例 247
9.6.1 賦值運算符 247
9.6.2 函數調用運算符 250
9.6.3 下標運算符 251
9.7 類型轉換 253
9.7.1 由其他類型向定義類的轉換 253
9.7.2 由自定義類向其他類型的轉換 255
9.7.3 隱式轉換帶來的二義性 257
9.8 重載函數選擇規則 257
9.8.1 重載解析 258
9.8.2 什么是完全匹配 258
9.9 小結 259
9.10 上機實踐習題 259
第10章 繼承 262
10.1 什么是繼承 262
10.1.1 簡單示例 262
10.1.2 繼承的層次性 264
10.2 派生類 264
10.2.1 public派生與private派生 264
10.2.2 protected成員與protected派生 265
10.3 多基派生 266
10.3.1 多基派生的聲明和定義 266
10.3.2 二義性問題 267
10.3.3 解決方案 268
10.4 虛基類 268
10.4.1 共同基類帶來的二義性 268
10.4.2 解決方案 270
10.4.3 虛基派生二義性與多基派生二義性不同 271
10.5 派生類的構造函數和析構函數 271
10.5.1 派生類的構造函數 271
10.5.2 派生類的析構函數 273
10.5.3 多基派生類的構造函數和析構函數 275
10.5.4 虛基派生類的構造函數和析構函數 275
10.6 分清繼承還是組合 278
10.6.1 繼承不是萬金油 278
10.6.2 組合 278
10.7 基類與派生類對象間的相互轉換 280
10.7.1 類型適應 280
10.7.2 多基繼承時的情況 282
10.7.3 公共基類 282
10.7.4 虛基類的情況 284
10.8 小結 284
10.9 上機實踐習題 285
第11章 多態 287
11.1 多態與虛函數 287
11.1.1 靜態聯編 287
11.1.2 動態聯編 287
11.1.3 為什么需要虛函數 287
11.1.4 虛函數的聲明和定義 290
11.2 虛函數的訪問 290
11.2.1 對象名訪問 291
11.2.2 指針訪問 292
11.2.3 引用訪問 292
11.2.4 類內訪問 293
11.2.5 在構造函數或析構函數中進行訪問 294
11.3 純虛函數與抽象類 295
11.3.1 純虛函數的聲明和定義 295
11.3.2 抽象類 296
11.3.3 另一種抽象類:類中只定義了protected型的構造函數 299
11.3.4 延伸:構造函數能否為private型 301
11.3.5 虛析構函數 302
11.4 虛函數引入的二義性 305
11.4.1 多基派生 305
11.4.2 共同基類和虛繼承 307
11.5 重載、覆蓋與隱藏 309
11.5.1 重載 309
11.5.2 覆蓋 309
11.5.3 隱藏 310
11.6 小結 311
11.7 上機實踐習題 312
第四篇 泛 型 編 程
第12章 模板 315
12.1 為什么要定義模板 315
12.1.1 類型參數化 315
12.1.2 模板的定義 317
12.2 函數模板 318
12.2.1 函數模板的使用 318
12.2.2 隱式實例化 318
12.2.3 顯式實例化 320
12.2.4 特化 321
12.2.5 重載 322
12.2.6 優先級與執行順序 322
12.3 類模板 324
12.3.1 定義類模板 324
12.3.2 隱式實例化 326
12.3.3 顯式實例化 326
12.3.4 顯式特化 327
12.3.5 部分特化 328
12.3.6 重載和優先級 328
12.4 模板的嵌套 329
12.4.1 函數成員模板 329
12.4.2 對象成員模板 330
12.5 模板參數 331
12.6 小結 332
12.7 上機實踐習題 333
第13章 標準模板庫 335
13.1 理解STL 335
13.1.1 容器 335
13.1.2 適配器 336
13.1.3 迭代器 336
13.1.4 算法 336
13.2 使用序列式容器 336
13.2.1 序列式容器的創建和元素的訪問 336
13.2.2 所有容器都支持的特征 338
13.2.3 序列式容器中元素的插入和刪除 339
13.2.4 vector容器 344
13.2.5 deque容器 344
13.2.6 list容器 344
13.3 使用關聯式容器 344
13.3.1 set容器 345
13.3.2 multiset容器 346
13.3.3 map容器 346
13.3.4 multimap容器 348
13.4 關聯式容器支持的成員函數操作 349
13.4.1 元素的插入 349
13.4.2 元素的刪除 352
13.4.3 元素的查找與訪問 354
13.5 迭代器 355
13.5.1 理解迭代器本質 355
13.5.2 迭代器類型 355
13.5.3 為什么要定義這么多迭代器 357
13.5.4 容器中定義的迭代器類型與5種類型的對應 358
13.5.5 流迭代器 358
13.5.6 迭代器失效 360
13.6 泛型算法 360
13.6.1 什么是函數對象 360
13.6.2 算法分類 361
13.7 適配器 365
13.7.1 容器適配器 366
13.7.2 迭代器適配器 367
13.7.3 函數適配器 369
13.8 小結 371
13.9 上機實踐習題 371
第五篇 輸入輸出處理和編程規范
第14章 輸入輸出和文件 373
14.1 輸入輸出概述 373
14.1.1 什么是文件 374
14.1.2 流 374
14.1.3 緩沖區 375
14.1.4 重定向 375
14.1.5 3種輸入輸出機制 376
14.2 高層I/O 377
14.2.1 標準輸出函數printf 377
14.2.2 標準輸入函數scanf 381
14.2.3 掃描集 384
14.2.4 sprintf函數和sscanf函數 385
14.2.5 fprintf函數和fscanf函數 386
14.2.6 文件訪問機制 386
14.3 流類庫 390
14.3.1 流類庫更安全、更高效 390
14.3.2 流類庫層次 390
14.4 輸出流 394
14.4.1 操作符<< 394
14.4.2 其他ostream方法 395
14.4.3 格式狀態字 397
14.4.4 格式控制值的默認值 398
14.4.5 flag函數讀取和設定格式狀態字 398
14.4.6 使用setf函數和unsetf函數設定格式關鍵字 400
14.4.7 設置域寬 402
14.4.8 填充字符 404
14.4.9 浮點數輸出和顯示精度 404
14.4.10 控制符 406
14.5 輸入流 408
14.5.1 >>操作符 408
14.5.2 輸入流與格式狀態字 408
14.5.3 輸入流與域寬 410
14.5.4 使用get函數讀取單個字符 411
14.5.5 使用get函數和getline函數讀取C風格字符串 413
14.5.6 其他istream方法 415
14.6 流狀態 417
14.6.1 什么是流狀態 417
14.6.2 讀取流狀態 417
14.6.3 管理流狀態 418
14.7 重載>>和<< 420
14.7.1 插入符的重載 420
14.7.2 抽取符的重載 422
14.8 文件操作 423
14.8.1 文件操作基本過程 423
14.8.2 文件的打開 423
14.8.3 取消文件和流的關聯 425
14.8.4 文件的讀寫 426
14.8.5 文本文件的讀寫 427
14.8.6 二進制文件的讀寫 428
14.8.7 文件定位指針和隨機讀取 429
14.9 字符串流 431
14.9.1 strstream類族 431
14.9.2 sstream類族 434
14.10 小結 437
14.11 上機實踐習題 437
第15章 名稱空間 439
15.1 什么是名稱空間 439
15.1.1 名稱空間范例 439
15.1.2 定義名稱空間 440
15.2 實體的作用域與可見域 441
15.2.1 實體可見域 442
15.2.2 可見域的擴展 442
15.2.3 using聲明機制 443
15.2.4 using聲明帶來的多重聲明問題(二義性) 445
15.2.5 空間內的屏蔽 445
15.2.6 先聲明,後使用 446
15.3 名稱空間的作用域與可見性 447
15.3.1 名稱空間的定義策略 447
15.3.2 推薦用法 450
15.3.3 名稱空間嵌套 451
15.3.4 using編譯指令 452
15.3.5 未命名的名稱空間 453
15.4 對名稱空間的思考 454
15.5 小結 454
15.6 上機實踐習題 454
第16章 異常和錯誤 456
16.1 編碼時的防錯 456
16.1.1 調用abort函數或exit函數 456
16.1.2 返回錯誤標志 457
16.2 異常機制 458
16.2.1 關鍵字throw 460
16.2.2 異常處理程序 460
16.2.3 自定義異常對象 463
16.2.4 有繼承關系的類異常 464
16.2.5 terminate函數和set_terminate函數 466
16.2.6 unexpected函數與set_unexpected函數 467
16.2.7 標準異常 468
16.2.8 對unexpected函數的補充 470
16.3 異常發生時的內存管理 471
16.3.1 堆棧解退 471
16.3.2 異常處理機制與函數的不同 472
16.3.3 構造函數中拋出異常 473
16.3.4 內存泄露 474
16.3.5 析構函數中可否拋出異常 475
16.4 auto_ptr類 476
16.4.1 使用auto_ptr類模板 477
16.4.2 關于auto_ptr的若干問題 477
16.5 小結 478
16.6 上機實踐習題 479
第17章 RTTI和類型轉換操作符 481
17.1 RTTI機制 481
17.1.1 dynamic_cast操作符 482
17.1.2 typeinfo類和typeid操作符 483
17.1.3 補充說明 484
17.2 類型轉換操作符 484
17.2.1 const_cast操作符 484
17.2.2 static_cast操作符 485
17.2.3 reinterpret_cast操作符 486
17.3 小結 486
17.4 上機實踐習題 487
第18章 string字符串類 489
18.1 為什么要使用string類 489
18.2 聲明一個字符串 489
18.3 字符串的輸入輸出 491
18.4 string類功能 492
18.4.1 string字符串和C風格字符串的轉換 492
18.4.2 賦值和清空 492
18.4.3 元素刪除 493
18.4.4 元素追加與相加 493
18.4.5 元素插入 494
18.4.6 大小和容量 494
18.4.7 元素存取 494
18.4.8 字符串比較 495
18.4.9 提取子串 495
18.4.10 搜索與查找 495
18.5 小結 496
18.6 上機實踐習題 496
第19章 編碼風格 497
19.1 程序的排版 497
19.1.1 注釋 497
19.1.2 空行的用法 498
19.1.3 代碼行 498
19.1.4 空格 498
19.1.5 縮進與對齊 499
19.1.6 &和*的位置 499
19.2 命名規則 499
19.2.1 Windows風格和Unix風格 500
19.2.2 如何對程序實體命名 500
19.3 項目文件的組織 500
19.3.1 模塊劃分 500
19.3.2 頭文件 500
19.3.3 定義文件 501
19.3.4 目錄結構 501
19.4 小結 501
19.5 上機實踐習題 502
第20章 程序編譯 503
20.1 程序的編譯流程 503
20.2 預處理 504
20.2.1 頭文件包含 505
20.2.2 宏 505
20.2.3 條件編譯 506
20.2.4 #ifdef、 #ifndef與重復包含 507
20.2.5 使用const代替#define定義常量 508
20.2.6 inline與#define的比較 509
20.3 VC6調試入門 509
20.3.1 斷點的設置與去除 509
20.3.2 條件斷點 510
20.3.3 數據斷點 510
20.3.4 消息斷點 511
20.3.5 觀察視圖(Watch) 511
20.3.6 內存視圖(Memory) 511
20.3.7 變量視圖(Variables) 511
20.3.8 寄存器視圖(Registers) 511
20.3.9 調用堆棧視圖(Call Stack) 512
20.3.10 反匯編視圖(Disassembly) 512
20.3.11 進程控制 512
20.4 其他調試手段 512
20.4.1 Debug模式和Release模式 512
20.4.2 assert宏 512
20.4.3 輸出字符串 513
20.5 小結 513
20.6 上機實踐習題 513
第六篇 面試題精選
第21章 常見面試題 517
21.1 常見基本知識問答題 517
面試題1:簡述面向對象的3個基本特征 517
面試題2:局部變量能否和全局變量重名 517
面試題3:類成員函數的重載、覆蓋和隱藏的區別是什么 518
面試題4:用變量a給出下面的定義 518
面試題5:在C++中,下面的結構是合法的嗎?如果是,其作用是什么 519
面試題6:在非C++中建類 A 和 B,在哪幾種情況下B能隱式轉化為A 519
面試題7:C++中的空類,默認產生哪些類成員函數 519
面試題8:C++有哪些性質(面向對象特點) 519
面試題9:子類析構時要調用父類的析構函數嗎 520
面試題10:什么是引用?聲明和使用“引用”要注意哪些問題 520
面試題11:將引用作為函數返回值類型的格式及優點有哪些 520
面試題12:引用與指針的區別是什么 520
面試題13:重載和重寫(覆蓋)的區別 520
面試題14:多態的作用是什么 520
面試題15:請指出const與#define相比有何優點 521
面試題16:C語言中static關鍵字的具體作用有哪些 521
面試題17:如何判斷程序是由C 編譯程序還是由C++編譯程序編譯的 521
面試題18:關鍵字const的含義是什么 521
21.2 世界500強公司的智力問答題 522
面試題19:工人分金條 522
面試題20:分蛋糕 522
面試題21:過橋問題 522
面試題22:黑白帽子 523
面試題23:電梯與鉆石 523
面試題24:手電筒傳遞 523
面試題25:燒繩問題 524
面試題26:圓的下水道蓋子 524
面試題27:選建筑師 524
面試題28:天平分鹽 524
面試題29:分不開的錢 524
面試題30:小鳥追火車 525
面試題31:給紅色最大的機會 525
面試題32:鏡子中的影像 525
面試題33:污染的藥丸 525
面試題34:稱出不是標準重量的水 525
面試題35:多彩的果凍 526
面試題36:電子游戲機 526
面試題37:監獄里的囚犯 526
面試題38:燈的狀態 526
面試題39:時針和分針 527
面試題40:3個奇數 527
面試題41:屋內的燈 527
面試題42:找出最重的球 528
面試題43:盲人分襪子 528
面試題44:燒香計時 528
面試題45:平分蜂蜜 528
面試題46:猜經理女兒的年齡 528
面試題47:兩個圓環 529
面試題48:喝啤酒 529
面試題49:算24點 529
面試題50:聰明人 529
面試題51:海盜分金幣 529
面試題52:到底是什么牌 530
面試題53:聰明的老板娘 531
面試題54:找出不同重量的球 531
21.3 分析題 532
面試題55:分析下面的程序段,顯示最後的結果 532
面試題56:分析程序最後的輸出結果 532
面試題57:分析最後輸出的結果 533
面試題58:求下面函數的返回值 533
面試題59:分析最後輸出的結果 534
面試題60:分析最後輸出的結果 535
21.4 編程題 536
面試題61:結果輸出到文件 536
面試題62:String類的具體實現 537
面試題63:鏈表題,一個鏈表的節點結構 538
面試題64:寫一個函數并找出在一個整數數組中第二大的數 540
面試題65:字符串的逆序輸出 541
面試題66:判斷操作系統的位數 541
面試題67:實現對數組的降序排序 542
面試題68:斐波那契數列1、1、2、3、5等,編寫程序求第10項 543
書摘/試閱
第1章C++概述
21世紀是個信息爆炸的時代,計算機、信息技術的發展日新月異,極大地改變了我們的溝通方式和生活方式。“足不出戶天下知”已成為現實,網上沖浪和聊天早已不是什么新名詞,網上炒股、網上辦公和網絡會議,也因其方便快捷,得到了廣泛的應用。撇開網絡不談,計算機在其他方面也早已成為人類不可缺少的工具與伙伴,有了計算機,學生可以事半功倍地完成課程的學習,倉庫管理員能更高效地完成工作,家庭主婦能保證收支的平衡,更好地管理財務,這樣的例子數不勝數。
計算機極大地改變了我們的生活,這些都是由不同的軟件來完成的,這些軟件稱為計算機程序。有了程序,計算機才能為人類工作,沒有軟件的計算機純粹是廢鐵一堆。可以從商場里或網絡上方便地得到各種軟件,如用來編輯文章的字處理軟件,用來合理組織數據的數據庫軟件,學習英語的軟件,供人娛樂的游戲軟件等,這些軟件是通過計算機程序設計語言編寫的。本書介紹的C++就是一門功能強大的程序設計語言,掌握了C++語言,我們便可以根據需要編寫自己的軟件。
計算機對大多數人來說已經不是什么新鮮事物了,花大力氣講計算機的詳細結構似乎沒有必要,但為了讀者能對計算機程序開發過程有個總體上的認識,先簡要介紹下計算機的組成、原理及計算機語言的一些基本概念。
本章主要涉及以下知識點。
? 計算機組成:介紹計算機組成的相關知識。
? 程序設計語言:介紹程序設計語言的分類。
? C++程序設計語言:介紹關于C++語言的基礎知識。
? 開發環境搭建:通過圖片和文字介紹如何搭建Visual C++開發環境。
? 實例講解:通過一個實例程序讓讀者認識C++程序設計。
1.1了解計算機
通俗地講,計算機是個“超級工具”,是個能執行命令的電子設備。幾乎所有的計算機都遵循馮?諾伊曼的“存儲—運行”結構,它有以下基本功能:輸入、輸出、存儲、執行算術和邏輯運算。計算機主要由硬件和軟件兩大部分組成,首先看一下什么是硬件。
注意 硬件相當于人類的身體,而軟件相當于人類的思想。
1.1.1計算機硬件
計算機的硬件主要有中央處理器(Central Processing Unit, CPU)、內存(或稱主存、隨機處理器、Random Access Memory, RAM)、輸入/輸出設備(Input/Output Devices)和外部存儲設備(Secondary Storage,多數為具備海量存儲功能的硬盤),圖1.1說明了計算機的硬件結構。
1. 中央處理器
如果把計算機比喻成一個人,中央處理器相當于大腦,是整個計算機的控制中心,中央處理器有以下幾部分組成:控制單元(Central Unit, CU)、程序計數器(Program Counter, PC)、指令寄存器(Instruction Register, IR)、算術邏輯單元(Algorithm Logic Unit, ALU)和累加器(Accumulator, ACC),這幾個單元相互配合完成程序指令的執行。
? 控制單元有3個主要作用:獲取并解釋指令,控制數據或指令信息在內存中的讀取,控制中央處理器內部各單元的工作。
? 程序計數器用來記錄下一步要執行指令的位置。
? 指令寄存器用來暫存當前正在執行的指令。
? 算術邏輯單元執行所有的算術和邏輯運算。
?累加器用來存儲算術邏輯單元的計算結果。
2. 內存
程序在執行前都要被裝載到內存中,才能被中央處理器執行,以Windows系統為例,若執行安裝在硬盤上的某個程序,實際上是將該程序的指令和數據導入內存,供中央處理器執行的過程。 內存是由按順序編號的一系列存儲單元組成的,在內存中,每個存儲單元都有唯一的地址,通過地址可以方便地在內存單元中存取信息。內存中的數據要靠供電來維持,當計算機關機或意外斷電時,其中的所有數據就永久地消失了。
3. 輸入/輸出設備
輸入/輸出設備是計算機與人交流的手段,負責讀入指令和數據的設備稱為輸入設備,如鍵盤和鼠標,負責顯示計算結果的設備是輸出設備,如顯示器和打印機。這里要特別說明的是外部存儲器,它既可以將指令和數據送入中央處理器,又可以存儲計算結果,所以外部存儲器既可以是輸入設備,又可以是輸出設備。
4. 外部存儲器
程序的指令和數據要裝入內存才能執行,但內存中的數據在斷電時或關機後就丟失了,為了長久保持有用的指令和數據,需要一個不依賴于供電、能“永久性”存儲數據的設備,我們把它稱為外部存儲器,典型的外部存儲器包括硬盤、軟盤、ZIP盤、光盤和磁帶等。
21世紀是個信息爆炸的時代,計算機、信息技術的發展日新月異,極大地改變了我們的溝通方式和生活方式。“足不出戶天下知”已成為現實,網上沖浪和聊天早已不是什么新名詞,網上炒股、網上辦公和網絡會議,也因其方便快捷,得到了廣泛的應用。撇開網絡不談,計算機在其他方面也早已成為人類不可缺少的工具與伙伴,有了計算機,學生可以事半功倍地完成課程的學習,倉庫管理員能更高效地完成工作,家庭主婦能保證收支的平衡,更好地管理財務,這樣的例子數不勝數。
計算機極大地改變了我們的生活,這些都是由不同的軟件來完成的,這些軟件稱為計算機程序。有了程序,計算機才能為人類工作,沒有軟件的計算機純粹是廢鐵一堆。可以從商場里或網絡上方便地得到各種軟件,如用來編輯文章的字處理軟件,用來合理組織數據的數據庫軟件,學習英語的軟件,供人娛樂的游戲軟件等,這些軟件是通過計算機程序設計語言編寫的。本書介紹的C++就是一門功能強大的程序設計語言,掌握了C++語言,我們便可以根據需要編寫自己的軟件。
計算機對大多數人來說已經不是什么新鮮事物了,花大力氣講計算機的詳細結構似乎沒有必要,但為了讀者能對計算機程序開發過程有個總體上的認識,先簡要介紹下計算機的組成、原理及計算機語言的一些基本概念。
本章主要涉及以下知識點。
? 計算機組成:介紹計算機組成的相關知識。
? 程序設計語言:介紹程序設計語言的分類。
? C++程序設計語言:介紹關于C++語言的基礎知識。
? 開發環境搭建:通過圖片和文字介紹如何搭建Visual C++開發環境。
? 實例講解:通過一個實例程序讓讀者認識C++程序設計。
1.1了解計算機
通俗地講,計算機是個“超級工具”,是個能執行命令的電子設備。幾乎所有的計算機都遵循馮?諾伊曼的“存儲—運行”結構,它有以下基本功能:輸入、輸出、存儲、執行算術和邏輯運算。計算機主要由硬件和軟件兩大部分組成,首先看一下什么是硬件。
注意 硬件相當于人類的身體,而軟件相當于人類的思想。
1.1.1計算機硬件
計算機的硬件主要有中央處理器(Central Processing Unit, CPU)、內存(或稱主存、隨機處理器、Random Access Memory, RAM)、輸入/輸出設備(Input/Output Devices)和外部存儲設備(Secondary Storage,多數為具備海量存儲功能的硬盤),圖1.1說明了計算機的硬件結構。
1. 中央處理器
如果把計算機比喻成一個人,中央處理器相當于大腦,是整個計算機的控制中心,中央處理器有以下幾部分組成:控制單元(Central Unit, CU)、程序計數器(Program Counter, PC)、指令寄存器(Instruction Register, IR)、算術邏輯單元(Algorithm Logic Unit, ALU)和累加器(Accumulator, ACC),這幾個單元相互配合完成程序指令的執行。
? 控制單元有3個主要作用:獲取并解釋指令,控制數據或指令信息在內存中的讀取,控制中央處理器內部各單元的工作。
? 程序計數器用來記錄下一步要執行指令的位置。
? 指令寄存器用來暫存當前正在執行的指令。
? 算術邏輯單元執行所有的算術和邏輯運算。
?累加器用來存儲算術邏輯單元的計算結果。
2. 內存
程序在執行前都要被裝載到內存中,才能被中央處理器執行,以Windows系統為例,若執行安裝在硬盤上的某個程序,實際上是將該程序的指令和數據導入內存,供中央處理器執行的過程。 內存是由按順序編號的一系列存儲單元組成的,在內存中,每個存儲單元都有唯一的地址,通過地址可以方便地在內存單元中存取信息。內存中的數據要靠供電來維持,當計算機關機或意外斷電時,其中的所有數據就永久地消失了。
3. 輸入/輸出設備
輸入/輸出設備是計算機與人交流的手段,負責讀入指令和數據的設備稱為輸入設備,如鍵盤和鼠標,負責顯示計算結果的設備是輸出設備,如顯示器和打印機。這里要特別說明的是外部存儲器,它既可以將指令和數據送入中央處理器,又可以存儲計算結果,所以外部存儲器既可以是輸入設備,又可以是輸出設備。
4. 外部存儲器
程序的指令和數據要裝入內存才能執行,但內存中的數據在斷電時或關機後就丟失了,為了長久保持有用的指令和數據,需要一個不依賴于供電、能“永久性”存儲數據的設備,我們把它稱為外部存儲器,典型的外部存儲器包括硬盤、軟盤、ZIP盤、光盤和磁帶等。
主題書展
更多
主題書展
更多書展今日66折
您曾經瀏覽過的商品
購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。