1、視C++為一個語言聯邦 C、object-oriented C++、template C++、STL 2、儘可能使用const: 1)關鍵字const出現的星號左邊,表示被指物事常量;如果出現在星號右邊,表示指針自身是常量;如果出現在兩邊,表示被指物和指針都是常量。 2)stl迭代器中申明迭代器 ...
1、視C++為一個語言聯邦 C、object-oriented C++、template C++、STL 2、儘可能使用const: 1)關鍵字const出現的星號左邊,表示被指物事常量;如果出現在星號右邊,表示指針自身是常量;如果出現在兩邊,表示被指物和指針都是常量。 2)stl迭代器中申明迭代器為const就像申明指針為const一樣,表示這個迭代器不得指向不同的東西,但他所指向的東西的值是可以改動的。如果希望所指的東西不可被改動,你需要的是const iterator。 3)const成員函數:兩個成員函數如果只是常量性不同,可以被重載。如果一個函數的返回類型是個內置類型,那麼改動函數返回值從來就不合法。 4)在const和non-const成員函數中避免重覆:第一次這裡將*this從其原始類型轉為const類型。第二次則是從const operator []的返回值中移除const。添加const的那次強迫進行了一次安全轉型,使用static_cast。移除const的那個動作只可以藉由const_cast完成,沒有其他選擇。const成員函數調用non_const成員函數是一種錯誤行為,因為對象有可能因此被改動。 const char & operator[]()const {} char & operator[] { return const_cast<char&>(static_cast<const textblock&>(*this)[position]) } 請記住:將某些東西申明為const對象可以幫助編譯器查找出錯誤。const可被施加於任何作用於內對象、函數參數、函數返回類型、成員函數本體;當const和non_const成員函數有這實質等價的實現時,令non_const版本調用const版本可避免代碼重覆。 3、確定對象被使用前已先被初始化 1)為內置型對象進行手工初始化,因為C++不擺正初始化他們 2)構造函數最好使用成員初值列,而不要在構造函數本體內使用賦值操作。初值列列出的成員變數,其排列次序和他們在class中申明的次序相同 3)為免除“跨編譯單元之初始化問題”,請以local static對象替換non-local static對象。 4、瞭解C++默默編寫並調用那些函數 編譯器可以暗自為class創建default構造函數、copy構造函數、copy assignment操作符、以及析構函數 5、若不想用編譯器自動生成的函數,就該明確拒絕(接4) 為駁回編譯器自動提供的機能,例如copy構造函數、copy assignment操作符等,可將相應的成員函數申明為private並且不予實現。使用像uncopyable這樣的base class也是一種方法。 6、為多態基類填加virtual析構函數
polymorphic帶多態性質的,base class 應該申明一個virtual析構函數 。如果class帶有任何virtual的函數,他就應該擁有一個virtual析構函數;classes的設計目的如果不是為了base class 使用,或不是為了具備多態性,就不該聲明virtual析構函數.