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當然,也可以直接類外寫函式模板呼叫swap成員函式。template<>
void swap(widget& a, widget& b)
回頭來看,第二章在闡述如何寫好每乙個建構函式和析構函式。
正如第三章所說應遵從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...