讀書筆記-----C++ 0229

pass:

public繼承意味着is-a,virtual函數意味着接口必須被繼承,non-virtual函數意味着接口和實現都必須被繼承。


public繼承意味着is-a是以C++進行對象編程最重要的一個規則,假設A爲基類,B爲派生類,在is-a關係中,每個B都是A,反之則不成立,可以用數學中的關係表達,就是B集合屬於A集合。

派生類中的名稱會掩蓋基類中的名稱(名稱遮掩規則)

有三句話很重要:純虛函數的目的是讓派生類只繼承接口,虛函數(非純虛函數)的目的是讓派生類繼承該函數的接口和缺省實現,非虛函數的目的是令派生類繼承函數的接口及一份強制性實現。


使用公有繼承時,類可以繼承接口,可能繼承實現(基類的純虛函數提供接口,但不提供實現)。獲得接口的是is-a關係的組成部分。而使用組合,類可以獲得實現,但不能獲得接口。不繼承接口是has-a關係的組成部分


除非有好的理由允許構造函數被使用於隱式類型轉換,否則把它聲明爲explicit會更好,被聲明爲explicit類型的構造函數禁止編譯器執行非預期的類型轉換。

       在傳遞用戶自定義類型時,按引用傳遞比按值傳遞要好,傳遞內置類型(C-like)時和使用STL的迭代器和函數對象時,按值傳遞比較好。

       在程序中儘量不要有帶有不明確行爲的代碼。

       在《Effective C++》一書中,將C++分爲四個次語言組合成的高級語言是一個很好的劃分辦法,有助於對C++的理解,這四個次語言如下:

       1C,包括區塊、語句、預處理器、內置數據類型、數組、指針等;

2Object-Oriented C++,也就是C with classes,包括class、封裝、繼承、多態、虛函數等;

       3Template C++,這是C++泛型編程部分,Template帶來了TMP(模板元編程)這一嶄新的編程範型。

       4STL。

 

C++中儘量以const、enum、inline替換#define,因爲#define不被視爲語言的一部分,所以可能會引起一些難以預料的問題,以#define定義的常量可能不會被編譯器看到,而const常量作爲一個語言常量是肯定會被編譯器看到的,用const定義常量能產生更少的碼。#define不能提供任何封裝性,但是const成員變量可以被封裝的。

const int LEN =5;

const char *const pa = “hello”;

對於單純常量最好用const對象或enums替換#defines。

對於形似函數的宏最好用inline函數替換#defines。

下面兩種表示方法的意義相同:

viod f1(constWidget * pw);

void f2(Widgetconst *pw);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章