讀書筆記 Effective C

2022-03-01 14:17:51 字數 1728 閱讀 3853

這裡初看到」class」和」type」,感覺他們是說的是同一樣東西,但仔細讀了一下,兩者在文中還是有區別的。class側重於自定義的類,而type側重於系統預定義的類(像int、double、string、vector)。設計好的class,使之像設計type一樣,就是說要使自己設計的類像系統預定義的類那樣好用,這對設計思想提出了較高的要求。

要設計高效的class,需要回答以下的問題:

1. 物件如何去建立和銷毀?

這是建構函式和析構函式的問題,當然如果想要有堆分配方式,還需要過載new、new、delete和delete運算子;

2. 物件初始化與物件的賦值應該有什麼樣的差別?

初始化是建構函式和拷貝建構函式的事(這時候物件還沒有產生),但物件的賦值卻不同,因為此時等號左邊的物件已經存在了。

3. 新type如果被pass-by-value意味著什麼?

會呼叫相應的拷貝建構函式,要注意是否需要乙個深拷貝。

4. 什麼是新type的合法值?

要對物件的合法值進行限定,通常在建構函式中就對成員變數的範圍給出限定,警惕不安全的輸入值!

5. 你的新type需要配合某個繼承圖系嗎?

就是判斷自己設計的class是否需要繼承或被繼承,是基類還是派生類。如果是基類的話,要注意是否允許這個基類生成物件(是否需要利用純虛函式設計成抽象類),以及要將析構函式前面加上virtual。

6. 新type需要什麼樣的轉換?

主要是針對隱式轉換,operator othertype() const,但通常情況下隱式轉換也意味著隱患,所以設計時要謹慎。另外,建構函式中也要當心,如果不想讓隱式構造發生,就要在前面加上explicit關鍵字。舉個例子:

1

classa2

31213};

1415

void fun(a obj);

若呼叫fun(3),則編譯器也能接受,因為編譯器自動作了fun(a(3))的處理,這就是隱式構造。而如果使用者自己寫fun(a(3)),這是顯式構造。當a的建構函式前有explicit時,fun(3)的呼叫將通不過編譯器。通常情況下,隱式轉換是安全的。

7. 什麼樣的操作符和函式對此新type而言是合理的?

就是設計什麼樣的成員函式,以及過載哪些運算子。

8. 什麼樣的標準函式應該駁回?

是說哪些函式對外公開,哪些函式對內使用,這就是private,public和protected的功能啦,protected只有在有繼承關係的類中使用才能發揮它真正的力量,普通的類用private和public就足夠了。

9. 誰該取用新type成員?

與上面一條類似,就是類的封裝性問題,一些而言,成員變數都應該是private的,而在public函式裡面提供對這些成員變數的訪問get和set函式。如果需要的話,可以使用友元,但友元也要慎用,因為有些編譯器對之支援的不是很好,另一方面,友元成為破壞封裝性的特例,會帶來安全的隱患。

10. 什麼是新type的未宣告介面?

這個不大明白意思,先放在這裡……

11. 你的新type有多麼一般化?

這牽涉到泛型程式設計了,就是模板的概念,這是c++比c要方便的多的多的地方——它將需要的型別交給編譯器自動生成。

12. 你真的需要乙個新type嗎?

其實我覺得應該把這個問題放在第乙個,因為設計最初首先要問的就是這個問題,如果都沒有必要設計了,還需要回答前十乙個問題嗎?

最後總結一下:

class的設計就是type的設計,在設計之前先要把上述12個問題過一遍,這樣可以有把握設計乙個成功的類。

《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...

讀書筆記 Effective C

部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...