Effective C 要點整理(一)

2021-08-03 05:00:32 字數 1488 閱讀 9623

c++曾明確指出,當派生類(derived class)物件經由乙個基類(base class)指標被刪除,而該基類還帶著乙個non-virtual析構函式,其結果未有定義-實際執行時通常發生的是物件的派生成分沒被銷毀。而其基類成分通常會被銷毀,於是造成乙個詭異的「區域性銷毀」物件。這會造成資源洩露、在偵錯程式上浪費許多時間。 而消除這個問題的做法很簡單:給基類乙個virtual析構函式,此後刪除派生類物件就會銷毀整個物件,包括所有的派生類成分。

析構函式的運作方式:最深層的派生的那個class其析構函式最先被呼叫,然後是其每乙個base class的析構函式被呼叫。

純虛函式必須在派生類中重新宣告的,但是他們也可以擁有自己的實現。

如果成員函式是乙個非虛函式,意味著它並不打算在派生類中有不同的行為。實際上乙個非虛成員函式所表現的不變形凌駕於其特異性,因為它便是不論派生類變得多麼特異化,它的行為都不可以改變。

宣告非虛函式的目的是為了讓派生類整合函式的介面及乙份強制性實現。

牢記

介面繼承和實現繼承不同。在public繼承之下,派生類總是繼承基類的介面。

純虛函式只具體制定介面繼承。

非純虛函式具體制定介面繼承及預設實現繼承。

非虛函式具體制定介面繼承以及強制性實現繼承。

牢記

- private繼承意味著根據某物實現出。它通常比復合的級別低。但是當派生類需要訪問protected base class的成員,或需要重新定義繼承而來的virtual函式時,這麼設計也是合理的。

- 和復合不同,private繼承可以造成empty base 最優化。這對致力於「物件尺寸最小化」的程式庫開發者而言,很重要。

牢記

templates生成多個classes和多個函式,所以任何template**都不該與某個造成膨脹的template引數產生相依關係。

因非型別模板引數而造成的**膨脹,往往可消除,做法是以函式引數或class成員變數替換template引數。

因型別引數而早晨的**膨脹,往往可以降低,做法是讓帶有完全相同二進位制表述的具現型別共享實現碼。

牢記

嚴肅對待編譯器發出的警告資訊。

不要過度依賴編譯器的報警能力,因為不同的編譯器對待事情的態度不同。一旦移植到另乙個編譯器上,原本依賴的警告資訊可能會消失。

MySql操作要點整理

tinyint 1 位元組 smallint 2 個位元組 mediumint 3 個位元組 int 4 個位元組 integer 4 個位元組 bigint 8 個位元組 float x 4 如果 x 24 或 8 如果 25 x 53 float 4 個位元組 double 8 個位元組 dou...

C 語法要點整理

1.類有預設複製建構函式預設建構函式是淺拷貝的,複製後兩個物件指向乙個記憶體空間 2.自己寫的類的複製建構函式不一定能做到複製功能 看自己怎麼寫了。說明複製建構函式不一定就能起到複製的作用!3.複製建構函式起作用的三種情況 1 用乙個物件初始化另外乙個物件 2 如果有個函式的引數是類a的物件,那麼該...

uboot的啟動要點整理

對於ppc e500mc而言,從上電的一開始,cpu有預設配置的tlb位址空間,cpu執行的第一條指令一定在這個空間內,這樣虛擬位址才能轉換為實體地址,然後還有啟動的law local access window 預設配置 從實體地址到器件 比如cpu的片選cs0會選擇norflash,然後預設的l...