《C++精粹》之精粹

前言:
《C++精粹》(C++ Distilled)是計算機類書籍中的名著之一,作者是Ira Pohl。該書如同一張通往C++編程精髓的簡明地圖,同時也是一本編程風格規範的指南。2006年元旦,我讀完了這本書,整理完成書內所有源代碼,並對重要部分做了載要,此處共享。


第1章 程序結構
1:擁有一種編程風格,並保持一致性
示例程序1
名稱:gcd.cpp
功能:計算最大公約數程序
作用:示範程序風格
下載:源代碼

第2章 詞法成分
1:C++有6種不同的標記:keyword, identifier, constant, string constant, operator, punctuator.

第3章 常量
1:注意const和#define定義常量的區別

第4章 聲明及作用域規則
1:typedef機制用來爲它所定義的類型建立一個同義詞。
2:聲明可以出現在塊內任何地方
示例程序2
名稱:for_scop.cpp
功能:一些隨機數的平均值
作用:示範聲明可以在塊內任何地方
下載:源代碼

3: ::作用域解析操作符允許訪問外部定義的變量。
示例程序3
名稱:scope1.cpp
功能:無
作用:示例使用::i來訪問外部命名的變量
下載:源代碼

4:類可以嵌套,但內部類必須在外部類的作用域之內。
5:名字域,提供了單獨的作用域。
示例程序4
名稱:namespac.cpp
功能:無
作用:示例名字空間的嵌套,但不能在vc++下編譯,請使用Borland C++
下載:源代碼

第5章 文件鏈接規則
1:extern的使用
示例程序5
名稱:prog1.cpp, prog2.cpp, prog3.cpp, prog4.cpp
功能:無
作用:與其他幾個文件(prog1,prog2, prog3)配合,示例extern的用法
下載:源代碼

2:多文件程序中需要的枚舉成員和typedef成員應置於頭文件中
示例程序6
名稱:my_types.h, fcns.cpp,mainfile.cpp
功能:無
作用:示例多文件程序中需要的枚舉成員和typedef成員應置於頭文件中
下載:源代碼

第6章 類型
1:基本類型有整型和浮點型。
2:新增類型是bool和wchar_t。
3:5個存儲類關鍵字:auto, register, extern, static, typedef
4:2個特殊類型修飾符:const, volatile

第7章 類型轉換
1:自動的表達式類型轉換規則: int2:C++標準的類型轉換有4種
強制類型轉換:static_cast(i)
系統依賴性的強制轉換,儘量少用:reinterpret_cast(&x)
消除常量限制(const)的轉換:const_cast(c_var)
用於運行時類型識別的轉換:dynamic_cast
示例程序7
名稱:stcast.cpp
功能:無
作用:示例C++標準的強制類型轉換
下載:源代碼

第8章 表達式及運算符
1:new和delete是運算符,可以被重載
示例程序8
名稱:alloc.cpp
功能:無
作用:示例使用new運算符動態分配數組
下載:源代碼

示例程序9
名稱:ovl_new.cpp
功能:重載new,使new變爲在已定義數組上查找空間分配
作用:示例重載new運算符
下載:源代碼

2:函數調用()和下標[]都是運算符

第9章 語句
這裏都非常熟悉,無需介紹
示例程序10
名稱:if.cpp, while.cpp, forloop.cpp, do.cpp, switch.cpp,goto.cpp
功能:見代碼註釋
作用:示例各種語句,見文件名
下載:源代碼

第10章 函數
1:C++中,函數參數除了聲明爲應用類型外均爲傳值調用
示例程序11
名稱:stats.cpp
功能:用來尋找一個數據集合的平均值,最大值和最小值
作用:示例函數的引用調用
下載:源代碼

示例程序12
名稱:greater.cpp
功能:比較大值
作用:示例C++標準的引用調用和C標準的指針調用
下載:源代碼

2:形參可以有默認值,但必須靠右
示例程序13
名稱:power2.cpp
功能:pow()函數默認對n平方
作用:示例函數形參的默認值
下載:源代碼

3:重載:函數用同一名字來實現
示例程序14
名稱:avg_arr.cpp
功能:求平均值
作用:示例函數重載
下載:源代碼

4:非C++函數的鏈接規則可以規定爲使用鏈接說明。最常用的是extern “C”

示例程序15
名稱:mult.cpp
功能:求一個數的N次方,默認爲2次方
作用:示例函數重載,默認值等
下載:源代碼

第11章 類
1:class的默認類型爲私用的,struct的默認類型爲公用的
2:構造函數
(1) 默認構造函數:參數列表爲空或都有默認值
(2) 拷貝構造函數:形如type::type(const type& x);
(3) 自動轉換函數:只帶一個參數的構造函數
(4) 不允許自動轉換函數:在自動轉換函數前加關鍵字explicit
示例程序16
名稱:printabl.cpp
功能:使用ASCII標識打印不可見字符
作用:示例自動轉換函數
下載:源代碼

3:友元函數:常用於運算符的重載,原因是若將重載運算符作爲非成員函數,只能用友元函數,這樣才能對私有成員進行訪問
示例程序17
名稱:complexc.cpp
功能:複數的加法運算
作用:示例使用友元函數進行二目運算符的重載
下載:源代碼

4:this指針只能用於非靜態函數中
示例程序18
名稱:clock.cpp
功能:一個計時類,可以增加時間一秒和打印出時間
作用:示例使用this指針
下載:源代碼

5:函數重載的一個特性便是運算符的重載,關鍵字operator用於重載運算符
示例程序19
名稱:vect_ovl.cpp
功能:一個向量類
作用:示例構造函數,運算符重載,錯誤信息輸出等,詳見代碼
下載:源代碼

6:靜態及常值成員函數:靜態成員函數不能訪問任意一個使用this指針的成員,常量成員函數不能修改成員變量的值。
示例程序20
名稱:salary.cpp
功能:一個工資類,計算出總工資數目
作用:示例靜態成員函數和常量成員函數的定義和使用
下載:源代碼

7:關鍵字mutable允許變量中含有const聲明的數據成員仍爲可修改的
示例程序21
名稱:mutable.cpp
功能:修改一個const聲明的類的成員變量
作用:示例mutable允許變量中含有const聲明的數據成員仍爲可修改的
注意:可能VC++(6.0)對C++的新特性支持不夠好,所以無法通過編譯
下載:源代碼

示例程序22
名稱:my_str.cpp
功能:一個簡單的string類
作用:示例一個類的設計
下載:源代碼

第12章 繼承
1:繼承的語法
示例程序23
名稱:vect_bnd.cpp
功能:一個繼承自vect基類的類
作用:示例繼承類的寫法
下載:源代碼

2:多繼承是從多個基類派生的類,這種類的設計模式叫做模式適配
3:抽象基類:成員函數都是純虛函數的類
4:類成員指針:形如T::*的指針,如int trio::*p = &trio::b;
示例程序24
名稱:trio.cpp
功能:無
作用:示例類成員指針的定義和使用
下載:源代碼

5:運行時類型識別(RTTI)提供了在運行時通過基類指針安全的決定類型指針的機制,主要有下面兩個操作符
(1):Derived *bptr=dynamic_cast(ptr);
(2):typeid(bptr).name;
示例程序25
名稱:typeid.cpp
功能:輸出類型名的字符串
作用:示例操作符typeid()的用法
下載:源代碼

6:虛函數,作用是提供運行時動態選擇合適的基類或派生類函數的機制
示例程序26
名稱:shape.cpp
功能:分別輸出長方形和圓形的面積
作用:示例虛函數實現運行時類型識別的原理
下載:源代碼

示例程序27
名稱:student.cpp
功能:輸出學生類實例的姓名,ID,年,成績
作用:示例繼承的用法
下載:源代碼

 第13章 模板
1:模板的作用是允許實例爲每一個類型自動生成代碼
示例程序28
名稱:stack_p.cpp
功能:利用棧模板類實現數組元素的反轉操作
作用:示例模板類
下載:源代碼

示例程序29
名稱:array.cpp
功能:兩個模板實例的操作
作用:示例模板的實例化用法及模板類的默認參數
下載:源代碼

2:函數模板:普通函數也可以模板化
示例程序30
名稱:swap.cpp
功能:使用函數模板反轉兩個元素
作用:示例函數模板的用法
注意:因爲編譯器不支持的原因,該文件在vc6下不能通過編譯
下載:源代碼

3:模板專門化:相當於定義一個特例

示例程序31
名稱:vect_it.cpp
功能:實例化向量模板類,輸出所有元素
作用:示例模板類的定義和用法
下載:源代碼

第14章 異常
1:拋出異常
示例程序32
名稱:throw.cpp
功能:函數拋出一個整型變量
作用:示例拋出異常
下載:源代碼

2:異常處理
示例程序33
名稱:catch.cpp
功能:去掉註釋,拋出異常,看運行結果如何
作用:示例拋出異常和異常處理,說明異常的拋出和處理是精確匹配的
下載:源代碼

3:異常規格說明是函數聲明的一部分
4:terminate()和unexpected()的用法

示例程序34
名稱:vect_ex.cpp
功能:向量類,多加了異常處理
作用:示例在一個類裏拋出異常和異常處理
下載:源代碼

第15章 輸入/輸出
1:輸入輸出頭文件是iostream.h
2:輸出類ostream
(1)格式化輸出,操作符見表,有些定義在iostream.h,有些在iomanip.h
示例程序35
名稱:manip.cpp
功能:在整型I/O中使用不同的基址
作用:示例格式化輸出
下載:源代碼

(2)用戶自定義輸出
示例程序36
名稱:pr_card.cpp
功能:用戶自定義的輸出程序,外國佬的紙牌玩法不懂,不知道最後輸出的內容
作用:示例自定義的輸出
下載:源代碼

示例程序37
名稱:pr_card2.cpp
功能:改進上一例【用戶自定義的輸出程序】,重載<<輸出
作用:示例模板的實例化用法及模板類的默認參數
下載:源代碼

3:輸入流istream:包含>>,get, getline ,read 等成員
示例程序38
名稱:basic_i.cpp
功能:無
作用:示例基本輸入
下載:源代碼

4:文件:順序處理的字符串流,包含fstream.h進行I/O處理,重要函數有open, close
5:流式字符串:必須包含頭文件strstream.h,可使用istrstream和ostrstream兩個類
示例程序39
名稱:str_strm.cpp
功能:無
作用:示例istrstream類的使用
下載:源代碼

6:ctype.h中定義了一組測試字符的函數和字符轉換函數。
7:對於某一特定的流,可使用一些函數進行測試。
示例程序40
名稱:word_cnt.cpp
功能:計算單詞個數,從鍵盤輸入字符得不到正確結果,僅是示範
作用:示例使用流狀態
下載:源代碼

8:混和I/O流庫,即混和iostream.h和stdio.h,使用ios::sync_with_stdio();就可以混用
示例程序41
名稱:mix_io.cpp
功能:計算N的階乘
作用:示例混和I/O流庫
下載:源代碼

示例程序42
名稱:dbl_io.cpp
功能:把一個文件的內容多加一行空行並寫入另一個文件中
作用:示例文件的讀寫
下載:源代碼

第16章 STL
1:容器
示例程序43
名稱:stl_cont.cpp
功能:使用STL鏈表容器將數組排序並求和
作用:示例STL鏈表容器的用法
下載:源代碼

示例程序44
名稱:stl_deq.cpp
功能:將向量裏的元素存入雙端隊列裏,並求所有元素之和。
作用:示例STL向量和雙端隊列的用法
下載:源代碼

(1)序列式容器:包括向量、鏈表和雙端隊列
示例程序45
名稱:stl_vect.cpp
功能:將向量裏的元素插入雙端隊列裏
作用:示例STL向量和雙端隊列的用法
注意:在VC6.0裏無法通過編譯,請在對C++STL支持更好的編譯器裏進行編譯
下載:源代碼

(2)關聯式容器:包括集合、圖、多重集合、多重圖,他們有基於關鍵字的可訪問元素
示例程序46
名稱:map_age.cpp
功能:初始化圖,並輸出
作用:示例STL圖的用法
下載:源代碼

(3)容器適配器:包括堆棧,隊列,優先隊列
示例程序47
名稱:stl_stak.cpp
功能:利用棧先進先出的特點倒序輸出三個字符串
作用:示例STL棧的用法
下載:源代碼

2:迭代器,可以看作是一個增強型的指針
示例程序48
名稱:stl_iter.cpp
功能:將元素插入集合,並輸出
作用:示例STL迭代器和集合的用法
下載:源代碼

(1)輸入流迭代器-istream_iterator
示例程序49
名稱:stl_iitr.cpp
功能:無
作用:示例STL輸入流迭代器
下載:源代碼

(2)輸出流迭代器-ostream_iterator
示例程序50
名稱:stl_oitr.cpp
功能:無
作用:示例STL輸出流迭代器
下載:源代碼

(3)迭代器適配器-提供後序遍歷和插入操作的遍歷
示例程序51
名稱:stl_iadp.cpp
功能:分別正常和使用反向迭代器反向輸出某個向量裏的元素
作用:示例STL反向迭代器
下載:源代碼

3:算法――包括分類算法,非質變序列算法,質變序列算法,數值算法
(1)分類算法――包括常規分類、歸併、字符串比較、排列、二分搜索等
示例程序52
名稱:stl_sort.cpp
功能:對隨機產生的數據進行排序
作用:示例分類算法
下載:源代碼

(2)非質變序列算法――不改變容器的內容
示例程序53
名稱:stl_find.cpp
功能:尋找字符串"hop"的位置,輸出其後的單詞
作用:示例非質變序列算法
下載:源代碼

(3)質變序列算法――改變容器的內容
示例程序54
名稱:stl_revr.cpp
功能:填充一個向量,並反序,用到質變函數copy與reverse
作用:示例質變序列算法
下載:源代碼

(4)數值算法――求和,內積,相鄰差額
示例程序55
名稱:stl_numr.cpp
功能:求向量和、向量內積
作用:示例數值算法
下載:源代碼

4:函數對象
(1)STL有三類函數對象,分別是算術對象,比較對象,邏輯對象
示例程序56
名稱:stl_fucn.cpp
功能:使用了函數對象minus
作用:示例STL函數對象
下載:源代碼

(2)函數適配器――創建自己的函數對象
示例程序57
名稱:stl_adap.cpp
功能:使用了綁定函數bind2nd()
作用:示例函數適配器
下載:源代碼

第17章 字符串庫
1:C++通過標準頭文件string來提供字符串類型
示例程序58
名稱:stl_strg.cpp
功能:無
作用:示例string類的用法
下載:源代碼
第18章 注意事項及兼容性
第19章 C++的新特性
發佈了68 篇原創文章 · 獲贊 11 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章