1. 程式人生 > >Effective C++ 49,50

Effective C++ 49,50

code 才幹 以及 錯誤類型 編譯器 cat 依賴關系 處理 類模版

49.熟悉標準庫。

C++標準庫非常大。

首先標準庫中函數非常多,為了避免名字沖突。使用命名空間std。而之前的庫函數都存放於< .h>中,如今成為偽標準庫。而不能直接將這些頭文件所有直接加入命名空間,標準委員會僅僅能又一次創建了不帶.h的頭文件。對於C中頭文件採用相同的方法,可是每一個名字前加入一個c。如C中的<string.h>變成了<cstring>。舊的c++頭文件是官方反對使用的,但舊的c頭文件不是,為了保持對C的兼容性。

如 <string.h>是舊的C頭文件,相應的是基於char*的字符串處理函數,<string>是包括了std的C++頭文件。相應的是新的string類,而<cstring>是C頭文件的std版本號,但這裏沒有string類的舊c++版本號,由於官方不推薦這樣做。

第二。庫中差點兒都是模版。如iostream,操作字符流。流類實際就是類模版,在實例化流類的時候指定字符類型。

即使是string,事實上也是一個模版。類型參數限定了每一個string類中的字符類型。string的類型聲明是:

typedef basic_string<char, char_traits<char>, allocator<char> >
	string;

這裏的字符類型與之前iostream中的字符類型是一個意思,它不是指char,指的是一個流中的字符,這裏字符類型確定其參數,字符類型指的是字符集。由於不同的字符集在實現的細節上不同,如特殊的文件結束字符。拷貝他們的數組的最有效方式等。這些特征在標準中被稱為traits。然後還有string對象運行動態內存分配的方法,使用一個Allocator參數。而Allocator類型的對象被用來分配和釋放string對象的內存,其是一個內存管理器。不要手動的聲明標準庫中的不論什麽部分。

Iostream。和傳統的Iostream相比。它已經被模版化,繼承層次結構也進行了改動。添加了拋出異常的能力。支持string(通過stringstream)和國際化(通過locales)。

新的Iostream能夠將string和文件當作流,還能夠對流的行為做更廣泛的控制,包含緩存和初始化。

容器。標準庫中提供了一下的高效實現。vector,list,queue,stack,deque,map,set和bitset。string是容器。對容器的不論什麽操作都適用於string。標準庫的實現是高效的。使用容器能夠消除動態分配內存造成的內存泄漏。

算法,標準庫中提供了大量的簡易方法,稱為algorithm,實際為函數模版。當中大多數適用於庫中全部容器以及內建數組。算法將容器的內容作為序列,每一個算法能夠應用與一個容器中全部值相應的一個序列。或者一個子序列。

標準算法有,for_each 為序列中的每一個元素調用某個函數。 find 在序列中查找包括某個值的第一個位置, count_if 計算序列中滿足某個判定為真的元素的數量。equal 推斷兩個序列包括的元素的值是否全然相等,search 在一個序列中找出某個子序列的起始位置,copy 拷貝一個序列到還有一個, unique 在序列中刪除反復值, rotate 旋轉序列中的值,sort 對序列中的值排序。等等。和容器操作一樣,算法也有性能保證。

對國際化的支持。提供有助於開發出國際化軟件的特性。支持國際化的最基本的構件是facets 和 locales 。

facets描寫敘述的是對一種文化要處理哪些特性。包含排序規則(即某些地區字符集中的字符應該怎樣排序),日期和時間應該怎樣表示,數字和貨幣值應該怎樣表示。怎樣將信息表示符映射成明白的語言信息,等等。locales 將多組facets捆綁在一起,facets是指前面說到的那些特性中的一個,而locales 表示多個facets組成的一個對於某個國家的規則,若一個locales表示美國人是怎樣解決前面幾個問題的。

對於數字處理的支持。C++庫中為復數類和專門針對數值編程而設計的特殊數組提供了模版。如valarray 類型的對象能夠用來保存能夠隨意混疊的元素,

診斷支持。標準庫支持三種報錯方式:C的斷言。錯誤號,例外 exception 。例外先派生出 logic_error 和 runtime_error ,然後再有這兩個類派生出詳細的錯誤類型。logic_error 表示軟件中的邏輯錯誤,理論上能夠通過更細致的程序設計來防止。runtime_error 類型的例外為執行時才幹發現的錯誤。

標準庫中的容器和算法這部分一般被稱為標準模版庫 STL 。

STL是標準庫中最具創新的部分,它的體系結構具有擴展性。依照STL中的規範,能夠進行非常多擴展。


50.提高對C++的認識。

C++設計時的首要目標:與C的兼容性。效率,和傳統開發工具及環境的兼容性,解決真實問題的可應用性(即面向對象)。

以上目標闡明了C++語言中大量的實現細節。如,為什麽隱式生成的拷貝構造函數和賦值運算符要像如今這樣工作,尤其是指針產生的淺拷貝問題?由於這是C對struct的拷貝和賦值的方式,要與C兼容。為什麽析構函數不自己主動聲明為virtual,為什麽實現細節必須出如今類的定義中?由於不這樣做會帶來性能上的損失。效率非常重要。為什麽C++不能檢測非局部靜態對象間的初始化依賴關系?由於C++支持單獨編譯(即,分開編譯源模塊。然後將多個目標文件鏈接起來,形成可運行程序),依賴現有的鏈接器。不會程序數據打交道,所以c++編譯器差點兒不可能知道整個程序的一切情況。為什麽C++不讓程序猿從一些繁雜事務如內存管理和低級指針操作中解脫出來?由於一些程序猿須要這些處理能力,一個真正的程序猿的須要自關重要。




Effective C++ 49,50