天天看點

條款1:視C++為一個語言聯邦條款1:視C++為一個語言聯邦

條款1:視C++為一個語言聯邦

​   最開始C++隻是在C上添加了一些面向對象的特性。從C++最初的名稱C with Classes也反映了這個血緣關系。

​   随着C++的發展和成熟,其體系越來越龐大,開始接受不同于面向對象的各種觀念、特性以及程式設計戰略。exception對函數結構化帶來不同的做法,templates将我們帶到新的設計思考方式,STL定義了一個前所未見的伸展性做法。今天的C++已經是一個多重範型程式設計語言,一個同時支援過程形式、面向對象形式、函數形式、泛型形式以及元程式設計形式的語言。這些能力和彈性使C++成為一個無可匹敵的工具。

​   那我們如何了解C++這門語言呢?最簡單的方法就是将C++視為一個由相關語言組成的聯邦(集合),而非單一語言。在其某個次語言中,各種守則與通例都傾向簡單、直覺易懂并且容易記住。然而你從一個次語言移往另外一個次語言,守則可能改變,為了了解C++,你必須認識其主要的次語言。其主要的次語言大概包括四個:

  • C。說到底C++仍是以C為基礎。函數塊(blocks)、語句(statements)、預處理器(preprocessor)、内置資料類型(build-in data types)、數組(array)、指針(pointer)等都來自C。許多時候,C++對問題的解法其實不過是較進階的C解法,(例如條款2中談到的預處理器的另外一個選擇,條款13談到以對象管理資源),當你以C++中的C成分工作時,高效程式設計守則映射出C語言的局限:沒有模闆(template)、沒有異常(exception),沒有重載(overload)
  • Object-Oriented C。這部分是C++最原始的功能:面向對象。classes中包括構造函數/析構函數;封裝(encapsulation)、繼承(inheritance)、多态(polymorphism)、virtual函數。這部分直接反映了C++的面向對象特性
  • Template C++。這是C++的泛型程式設計部分,也是大多數程式員程式設計經驗最少的部分。template相關考慮和設計的已經彌漫整個C++,良好的程式設計守則中“唯template适用”的特殊條款并不罕見(如條款46中,談到調用template functions時如何協助類型轉換)。實際上由于template威力強大,它帶來嶄新的程式設計範型,也就是所謂的template metaprograming(TMP,模闆元程式設計),TMP相關規則很少與C++主流程式設計互相影響。
  • STL。STL是template程式庫,看名稱也知道,但是它是非常特殊的一個。他對容器(containers)、疊代器(iterators)、算法(algorithms)以及函數對象(function objects)的規約有極佳的緊密配合與協調,然而templates以及程式庫也可以其他想法建置出來。STL有自己特殊的辦事方式,當你夥同STL工作時,你必須遵順它的規約。

​   當從一種次語言轉向另一種次語言的時候,可能會導緻高效程式設計規則有所變化。例如對于内置類型而言pass-by-value通常比pass-by-reference高效,但是當你從C移往Object-Oriented C的時候,由于使用者自定義的構造函數和析構函數的存在,pass-by-reference-to-const往往更高效。運用Template C++時尤為如此,因為這個時候你甚至不知道所處理對象的類型。然而一旦跨入STL你就會了解,疊代器和函數對象都是在C指針的基礎上塑造出來的,是以對STL的疊代器和函數對象而言,舊式的C pass-by-value守則則再次适用。

​   是以說C++并不是一個帶有一組守則的一體語言;它是從四個次語言組成的聯邦,每個次語言都有自己的守則,同樣的用法在不同次語言中的守則可能不同,按照這四個次語言了解C++比較容易了解的多。

總結:C++高效程式設計守則視情況而變化,取決于你使用C++的哪一部分。