原因:
賦值與初始化
classa;
a::a
(const
int&n)
a::a
(const
int&n):x
(n),
y(n)
c++規定,物件成員變數的初始化動作發生在進入建構函式本體之前。
編譯器總是會為使用者自定義型別之成員變數自動呼叫預設建構函式-如果在成員初值列中沒有被指定初值。
為了避免漏掉某些必須初值的成員變數,於是有:
filesystem &
tfs(
)//在類乙個另類中可以 呼叫fs()方法獲取乙個靜態tfs物件
總結:
在乙個空類,當這些函式並呼叫時,才會被建立出來
拒絕copying操作,可以將copy建構函式和預設過載賦值運算子函式宣告為private,但不能防止在public的成員函式中錯誤的使用他們。
所以有乙個專為為阻止copying錯誤設計的方法
class
uncopyable;~
uncopyable()
;private
:uncopyable
(const uncopyable&);
uncopyable& operatpr=
(const uncopyable&);
};class
homeforsale
:private uncopyable
;//當想要copy homeforsale時,會被拒絕
總結:為了駁回編譯器自動的功能可以將相應的成員函式宣告為private不給予實現。
當乙個派生類物件經由乙個基類指標刪除,而基類帶有非虛的析構函式,則通常會發生派生類中的派生部分並沒有被銷毀。
消除該問題的方式,這是在基類中使用virtual析構函式。
則在設計乙個類時,可以以是否設計virtual函式來確定該類是否意圖作為基類。
帶有虛函式的類,會再類中建立乙個虛函式表,會導致類的體積增加。那麼如果該類不作為基類,則不需使用虛函式。
總結:多型的基類應該宣告乙個virtual析構函式。如果class中帶有任何的virtual函式,它必須擁有乙個virtual析構函式。
如果在析構函式函式吐出異常,程式也可能過早結束或出現不明確行為。
如果在析構函式中必須執行乙個動作,而該動作可能會發生異常:
以下方法可以避免問題:
//close丟擲異常就結束程式
a::~a(
)catch(.
..)}
//若不適應abort(),則會吞下異常,這通常是個壞主意
但上述方法都不會對異常作出反應。
乙個較佳的方法是,設計乙個新的介面對可能出現的問題進行反應:
classa~
a()catch(.
..)}
};
總結: Effective C 學習筆記
學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...
Effective C 學習筆記
1 c 是乙個複合式的語言 c 中不同部分有著不同的語言特性,例如 1.1 在c中傳遞形參時,按照值傳遞比按照指標傳遞效率更高 1.2 在物件導向程式中,物件要按照const引用而不是按照值傳遞 1.3 在stl程式設計中採取按照值傳遞方式 所以說c 中沒有統一的準則,要按照不同的特性採取不同的使用...
Effective C 學習記錄
1.以by value 傳遞使用者自定義型別通常是個壞主意,pass by reference to const往往是比較好的選擇 一 讓自己習慣c 條款02 盡量以const,enum,inline替換 define 1 對於單純常量,最好以const物件或enums替換 defines。示例 d...