More Effective C 《基礎議題》

2021-10-16 17:01:09 字數 1313 閱讀 3354

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址,而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)引用不可以為空,當被建立的時候,必須初始化,而指標可以是空值,可以在任何時候被初始化;

(3)可以有const指標,但是沒有const引用;

(4)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的);

(5)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(6)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了;

(7)」sizeof引用」得到的是所指向的變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小;

(8)指標和引用的自增(++)運算意義不一樣;

(9)如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩漏。

(1)static_cast:基類與派生類之間的轉換;(基類–派生類不安全);內建內型之間的轉換;把空指標轉換為目標型別的空指標;把任何型別的表示式轉換成void型別。

注:它不能轉換const、volitale、_unaligned的屬性

(2)dynamic_cast:必須是類的指標、引用或void。在上行轉換(派生類—>基類)它和static_cast是一樣的,但是在下行轉換中它有型別檢查功能,比static_cast更安全。

(3)const_cast:去掉const和volatile屬性。

(4)reinterpret_cast:任意指標(或引用)型別之間的轉換;以及指標與足夠大的整數型別之間的轉換;從整數型別(包括列舉型別)到指標型別,無視大小。

由於基類和子類大小不一致,對陣列使用多型會導致錯誤,比如執行刪除陣列元素呼叫析構會紊亂。

預設建構函式的意義是在沒有任何外來資訊的情況下將物件初始化。

(1) 建構函式可以沒有形參,不要新增無用的形參影響呼叫方工作效率。

(2)如果建構函式有形參,就把預設值給上,原因:

①虛基類不提供預設建構函式,很難與其進行合作,因為幾乎所有的派生類在例項化時都必須給虛基類建構函式提供引數;

②無法在許多基於模板的容器類使用。模板要求被例項化的目標型別必須得有乙個預設建構函式。

More Effective C 擴充套件方法

c 3.0中增加了許多新特性.其中.擴充套件方法允許我們在不修改原有 的基礎上擴充套件類 介面的功能.有技巧的運用該特性.能寫出有效率 易維護 美觀的 c 2.0提供了許多泛型與容器的介面和類.最常見的如icomparable常常需要新建乙個comparable來進行排序比較等等.但其預設只有乙個c...

more effective C 條款四解讀

深刻考慮是否需要給類提供乙個預設建構函式 有一些類擁有乙個預設建構函式是合理的需求,比如string比如容器 linked list vector 預設建構函式可以把他們初始化為空容器。但是有一些類我們最好還是不要提供預設建構函式。比如乙個equipment類 class equipment 對於這...

more effective C 條款八解讀

了解不同意義的new和delete 這裡所說的new是new operator,operator new 以及placement new。首先我們明確new操作符需要完成兩個工作,乙個是呼叫operator new分配一定的記憶體空間,呼叫物件的建構函式。如果我們我們打算自己給物件分配記憶體,那麼我...