Effective C 讀書筆記二

2021-08-18 04:46:02 字數 3916 閱讀 2869

resource management

designs and declarations總結

c++編譯器預設提供了三個建構函式和乙個析構函式

class empty  // default constructor

empty(const empty& rhs) // copy constructor

~empty() // destructor

empty& operator=(const empty& rhs) // copy assignment operator

};

boost庫有個noncopyable類,類似下面的類,作為想要拒絕複製的類的基類

class uncopyable  // and destruction of

~uncopyable() {} // derived objects...

private:

uncopyable(const uncopyable&); // ...but prevent copying

uncopyable& operator=(const uncopyable&);

};

polymorphic base classes實如其名,目的為了子類物件在面向介面程式設計時的正確釋放。

新規範析構函式預設noexcept(true),若丟擲異常,就直接terminate。書裡主要是說不明確行為,有倆異常時也會terminate。

class dbconn 

~dbconn()

catch (...) }}

private:

dbconnection db;

bool closed;

};

由於建構函式和析構函式呼叫順序,所以在基類構造和析構時,虛構函式並不會下降到子類(既然虛構理論上就是想讓其為基類)。

during base class construction, virtual functions never go down into derived classes.
保持正常邏輯可行,是好習慣。

在自我賦值的道路上要考慮異常安全,當然copy and swap 和 pass by value更簡潔。(c++ primer裡也有講)

widget& widget::operator=(const widget& rhs) // copy and swap

widget& widget::operator=(widget rhs) // pass by value

實現乙個copying function(如拷貝或賦值建構函式)時,

(1) copy all local data members and

inall

base

classes, too. //呼叫基類的copying函式

不要嘗試去實現乙個copying函式呼叫另乙個,應該把共同機能放到第三個函式中然後去呼叫(init函式)。

raii(resource acquisition is initialization)

智慧型指標(c++11已全部成了c++特性了)

auto_ptr shared_ptr 以及boost庫的 boost::scoped_array boost::shared_array

禁止複製(如muduo網路庫里的mutexlockguard)

引用計數(shared_ptr)

深度拷貝

轉移資源擁有權(auto_ptr)

class lock 

private:

std::tr1::shared_ptrmutexptr;

};

使用者可能需要原始資源作為引數傳入某個介面, 如:

class font 

~font( )

...private:

fonthandle f;

};

想要與下面的api通訊:

void changefontsize(fonthandle f, int newsize);

一、提供顯示呼叫介面:

fonthandle get() const

二、提供隱式轉換介面(參考stackoverflow):

operator fonthandle() const

如同作者推薦單引數建構函式使用explicit禁止隱式轉換一樣,作者更傾向於使用顯示呼叫介面。

std::string *stringptr1 = new

std::string;

std::string *stringptr2 = new

std::string[100];

...delete stringptr1; // delete an object

delete stringptr2; // delete an array of objects

平時使用倒是不會搞錯,有一點倒是容易被誤會

typedef

std::string addresslines[4];

std::string *pal = new addresslines;

delete pal; // fine

下面由於執行順序,可能會導致記憶體洩漏

processwidget(std::tr1::shared_ptr(new widget), priority());

應該像下面的樣子寫

std::tr1::shared_ptrpw(new widget);

processwidget(pw, priority());

面向使用者設計api,限制api使用的可能性(使傳參、返回值變窄)。

主要講了設計乙個類時需要考慮的事情(純理論版,用到再去對照)。

除了內建型別、stl迭代器和函式物件。都應用pass-by-reference-to-const方式傳值。

沒啥說的,基本問題了(作者寫的真多…)。

protected並不比public更有封裝性(這條又是基本原則了,又被作者寫了好多…)

member函式越多越破壞封裝性。在能不定義member函式也可完成功能時,選擇non-member,non-friend更好。後者增加封裝性、包裹彈性和機能擴充性。

譬如operator * 操作符過載時涉及了隱式型別轉換。

std提供了swap,其實現方式如下:

//namespace std

template< typename t >

void swap(t& a, t& b)

拷貝多次,可能存在效率問題,所以有時候需要自己實現:

class widget

...

};

在類外模板特例化(c++ primer pg624)

//namespace std

template<>

void swap(widget& a, widget& b)

當然,也可以直接類外寫函式模板呼叫swap成員函式。

回頭來看,第二章在闡述如何寫好每乙個建構函式和析構函式。

正如第三章所說應遵從raii方式以物件管理資源,我時常會頭疼異常了怎麼辦,第二章的不讓異常逃離析構函式讓我豁然開朗。

第四章似乎圍繞著封裝來闡述,除了最後一條,其他看似不新鮮卻非常有設計感。

讀書筆記 Effective C 二

條款20 寧以pass by reference to const替換pass by value class person class student public persion 假設有函式 bool validatestudent student s student plato bool pla...

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

Effective C 讀書筆記

一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...