九、雜項討論
(53)、不要輕忽編譯器的警告
class B {
public:
virtual void f() const;
};
class D : public B {
publlic:
virtual void f();
};
這裏希望以D::f重新定義virtual函數B::f,但其中有個錯誤:B中的f是個const成員函數,而在D中它未被聲明爲const。我手上的一個編譯器於是這樣說話了:
warning: D::f() hides virtual B::f()。
這個警告告訴你聲明於B中的f並未在D中被重新聲明,而是被整個被掩蓋了。如果忽略這個編譯器警告,幾乎肯定導致錯誤的程序行爲,然後是許多調試行爲,只爲了找出編譯器其實早就偵測出來並告訴你的事情。
不管怎樣說,在你打發某個警告信息之前,請確定你瞭解它意圖說出的精確意義。
記住,警告信息天生和編譯器相依,不同的編譯器有不同的警告標準。
請記住:
嚴肅對待編譯器發出的警告信息。努力在你的編譯器的最高(最嚴苛)警告級別下爭取“無任何警告”的榮譽。
不要過度依賴編譯器的報警能力,因爲不同的編譯器對待事情的態度並不相同。一旦移植到另一個編譯器上,你原本依賴的警告信息有可能消失。
(54)、讓自己熟悉包括TR1在內的標準程序庫
TR1代表“Technical Report 1”,宣示一個新版C++的來臨,我們可能稱之爲Standard C++ 1.1。
C++98列入的C++標準程序庫主要成分:
STL(Standard Template Library,標準模板庫)。
Iostreams。
國際化支持。
數據處理。
異常階層體系(exception hierarchy)。
C89標準程序庫。
TR1詳細敘述了14個新組建(components,也就是程序庫機能單位),統統都放在std命名空間內,更正確地說是在其嵌套命名空間tr1內。因此,TR1組件shared_ptr的全名是std::shared_ptr。本書通常在討論標準程序庫組件時略而不寫std::,但我總是會在TR1組件之前加上tr1::。
本書展示一下TR1組件實例:
智能指針(smart pointer)tr1::shared_ptr和tr1::weak_ptr。
tr1::function,此物得以表示任何callable entity(可調用物,也就是任何函數或函數對象),只要其簽名符合目標。
tr1::bind,它能夠做STL綁定器(binders)bind1st和bind2nd所做的每一件事,而又更多。
我把其他TR1組件劃分爲兩組。第一組提供彼此互不相干的獨立機能。
Hash tables,用來實現sets,multisets,maps和multi-maps。
正則表達式(Regular expressions)。
Tuples(變量組),這是標準程序庫中的pair template的新一代製品。
tr1::array,本質上是個“STL化”數組,即一個支持成員函數如begin和end的數組。
tr1::mem_fn,這是個語句構造上與成員函數指針(member function pointer)一致的東西。
tr1::reference_warpper,一個“讓references的行爲更像對象”的設施。
隨機數(random number)生成工具,它大大超越了rand,那是C++繼承自C標準程序庫的一個函數。
數學特殊函數。
C99兼容擴充。
第二組TR1組件由更精巧的template編程技術(包括template metaprogramming,也就是模板元編程)構成。
Type traits,一組traits classes,用以提供類型(types)的編譯期信息。
tr1::result_of,這是個template,用來推導函數調用的返回類型。
TR1自身只是一份文檔。
請記住:
C++標準程序庫的主要機能由STL、iostream、locales組成。幷包含C99標準程序庫。
TR1添加了智能指針(例如tr1::shared_ptr)、一般化函數指針(tr1::function)、hash-based容器、正則表達式(regular ecpression)以及另外10個組件的支持。
TR1自身是一份規範。爲獲得TR1提供的好處,你需要一份實物。一個好的實物來源是Boost。
(55)、讓自己熟悉Boost
Boost是一個C++開發者集結的社羣,也是一個可自由下載的C++程序庫羣。
Boost程序庫對付的主題非常繁多,區分數十個類目,包括:
字符串與文本處理。
容器。
函數對象和高級編程
泛型編程(Generic programming)
模板元編程(Template metaprogramming,TMP)
數學和數值(Math and numerics)
正確性與測試(Correctness and testing)
數據結構
語言間的支持
內存
雜項
請記住:
Boost是一個社羣,也是一個網站。致力於免費、源碼開放、同僚複審的C++程序庫開放。Boost在C++標準化過程中扮演深具影響力的角色。
Boost提供許多TR1組件實現品,以及其他許多程序庫。