Effective C 章節精簡版

2021-10-01 08:59:31 字數 3520 閱讀 3699

1.帶有類的c/c/template/stl

2.對於單純常量,最好以const物件替換#defines。對於形式函式的巨集,

最好用inline代替巨集。

enum取位址會違法.

控制其域

寧願編譯器替換預處理

巨集的括號,及演算法優先順序的煩惱

3.const星號左邊:被指物體常量/const星號右邊:指標自身常量

對單純遍歷,最好以const物件或enums替換#deines

對於形式函式的巨集,最好用inline替換為#define

4.確定物件被使用前已被初始化

5.為內建型物件進行手工初始化,因為c++不保證初始化他們

使用初始化列表初始化,不要在建構函式本體內使用賦值操作

為免除「跨單元之初始化次序」,以local static 物件替換non-local static物件

1.預設有建構函式,析構函式,拷貝建構函式。private/baseclass,可以阻止其自動提供。

2.有多型性質的類,析構函式也要有析構函式

3.沒有多型性質的就不宣告多型

4.析構函式中有異常

6.自賦值可能導致指標被提前釋放的問題

1.auto_ptr /share_ptr管理資源/使用raii物件

2.new delete

3.auto_ptr,複製動作會使它(被指物)指向null

-讓介面容易被正確使用,不易被勿用

1.好的介面很容易被正確使用,不容易被誤用。應該在實現的所有介面中努力達成這些性質。

2.「促進正常使用」的辦法包括介面的一致性,以及與內建型別的行為相容。

3.「阻止誤用」的辦法包括建立新型別、限制型別上的操作,束縛物件值,以及消除使用者的資源管理責任。

4.tr1::shared_ptr支援定製型刪除器(custom deleter)

1.切記將成員變數宣告為private。賦予客戶訪問資料的/一致性/細微劃分/彈性。

2.protected並不比public根據封裝性。

-盡量用non-member non-friend函式替換member函式。可以增加封裝性/包裹彈性/擴充性。

1.盡可能延後變數定義式。這樣做可增加程式清晰度和改善效率。

2.用到變數在定義就行,防止沒有必要的生命成本

四個關鍵字

c風格的轉型動作:(t)expression

函式風格的轉型動作:t(expression)

c++ 提供四種新型別轉換

//1. 指標指向類 

const a *pca1 = new a;

a *pa2 = const_cast(pca1); //常量物件轉換為非常量物件

pa2->m_inum = 200; //fine

//2. 指標指向基本型別

const int ica = 100;

int * ia = const_cast(&ica);

*ia = 200;

3.常量引用轉為非常量引用

a a0;

const a &a1 = a0;

a a2 = const_cast(a1); //常量引用轉為非常量引用

//常量物件被轉換成非常量物件時出錯

const a ca;

a a = const_cast(ca); //不允許

const int i = 100;

int j = const_cast(i); //不允許

const int a = 1;//允許

int * b = const_cast(&a);

*b = 2;

const int a = 1;//允許

int & b = const_cast(a);

b = 2;

網上看到的乙個比較好的**

const string& shorter(const string& s1, const string& s2) 

string& shorter(string& s1, string& s2)

dynamic_cast(e)  //e是指標

dynamic_cast(e) //e是左值

dynamic_cast(e)//e是右值

e能成功轉換為type*型別的情況有三種:

如果一條dynamic_cast語句的轉換目標是指標型別並且轉換失敗了,會返回乙個空指標,則判斷條件為0,即為false;如果轉換成功,指標為非空,則判斷條件為非零,即true。

補充:dynamic_cast 有個普通版本來說,他會呼叫strcmp,用以比較class名稱,所以效率較低

#include using namespace std;

class a

};int main()

可以將non_const轉為const,相反則不能(相反使用const_cast)

小結:

避免返回 handle(包括 reference、指標、迭代器)指向物件內部。遵守這個條款可增加封裝性,幫助 const 成員函式的行為像個 const,

並將發生「虛吊號碼牌」的可能性降至最低。

將檔案的編譯依賴關係降到最低:相依宣告式,不要依與定義式

template具現化與inline具現化無關

public意味著,基類的事情也一定適用於子類

class base ; 

class derived : public base

void insert(const t& item)

void remove(const t& item)

size_t size()const

void print()

;

private繼承根據某物實現

多重繼承可能導致歧義性,帶有virtual會增加成本。可以做虛介面繼承類或是private繼承

對template而言,介面是隱式的,基於有效表示式/多型則通過template具現化和函式過載發生於編譯期

typename內出現的名稱依賴於tenplate引數的時候,稱之為屬名稱

如果出現巢狀就叫巢狀從屬名稱。

任何情況你想要在template中指涉乙個巢狀從屬名稱,就用typename

template //這個合法的 c++ ** 

void print2nd(const c& container)

}

八.定製new和delete

new-handler作用:讓更多記憶體可被使用/安裝另乙個new-handler/卸除new-handler/丟擲bad_alloc(或派生自bad_alloc)的異常/不返回(abort或exit)

operator new/delete:用來檢查運用上的錯誤/統計資料/增加分配和回歸記憶體的速度/降低預設記憶體管理器帶來的額外開銷/彌補非最佳齊位/收集heap資訊/改善效能

AsyncTask原理精簡版

asynctask有三個主要的方法 onpreexecute doinbackground string.params onpostexecute 建立asynctask物件需要重寫乙個類繼承asynctask,因為asynctask本身是抽象類 new asynctask execute para...

Sql優化精簡版

1.select語句中避免使用 盡量應該根據業務需求按欄位進行查詢 2.刪除重覆記錄 delete from tble tb where tb.id select min id from tble ble where tb.name ble.name 3.用 替換 4.盡量多使用commit 如對大...

github 使用精簡版

使用git bash上傳時,必須進入需要上傳的檔案的目錄,例如我要上傳的檔案在c 1 1 1 upload 那麼我就要進入到c 1 1 1,然後用以下命令上傳檔案 刪除 git rm cached r useless git commit m remove directory from remote...