C++第十二章筆記
動態記憶體和類
動態記憶體如此靈活,在類中也十分常用。
如果在建構函式的時候使用new,那麼無論是構造,賦值,複製,析構都需要注意
如果在類中有個static靜態成員變數,便可以在類外用作用域解析運算子直接賦值,但是要指出變數型別,如:
int A::num = 0;
如果靜態成員是const或者列舉,則可以在類宣告初始化。
在複製,賦值過程中,可能會用到臨時變數,如果在類中存在動態記憶體,那麼給一個物件賦值時,是一個臨時變數給這個物件賦值,過程:
- 建立臨時變數,其中包括以後指向動態記憶體空間的指標
- 將臨時變數成員依次賦值給要賦值的物件
- 釋放臨時變數,包括釋放那段動態記憶體
很明顯,這樣形成了一個野指標。而這個複製過程被成為淺賦值。也就是由編譯器預設複製建構函式實現的。但是,對於使用動態記憶體的類來說,這樣明顯是有問題了。因此,要使用深度複製。
深度複製就是使用複製建構函式和過載賦值運算子。
靜態類成員函式
可以將成員函式宣告為靜態的(函式宣告包含關鍵字static)
- 不能通過物件呼叫靜態成員函式
- 靜態成員函式甚至不能使用this指標
- 如果靜態成員函式是在共有部分宣告的,則可以使用類名和作用域解析運算子來呼叫它
- 由於靜態成員函式不與特定的物件相關聯,因此只能使用靜態資料成員
- 可以使用靜態成員函式設定類級標記,以控制某些類介面的行為
在建構函式中使用new時應注意的事項
- 如果在建構函式中用了new,則應在解構函式中使用delete
- 如果使用new[],那應該使用delete[]
- 如果有多個建構函式,應該使用相同的new格式,因為只有一個解構函式,要保證相容性
- 應該定義一個賦值建構函式,通過深度複製講一個物件初始化為另一個物件(初始化,形參呼叫)
- 應該定義一個賦值運算子,通過深度複製將一個物件賦值給另一個物件
指標和物件之間的使用,和指標和結構體等的使用方式相同。善待指標!
為了防止隱式轉換可以使用explicit關鍵字。
初始化列表
應該是一個星期前,韓祥波老師把我叫講臺上做一個關於初始化列表的題,不過到現在我才知道什麼是初始化列表= =。
其實就是C++為const常量初始化的一種方式,只能用在建構函式上。
如果Queue類中有個叫qsize的常量,常量除了初始化是不允許被賦值的,那麼就使用初始化列表進行初始化:
Queue (int qs):qsize(qs)
{
...
}
其他變數也可以用初始化列表進行初始化。其初始化的順序和類宣告中的順序相同,和初始化列表的順序無關。
C++11給diao,他可以在類宣告中,直接初始化,甚至就是直接預設引數。
就像之前說的,就是在總結的時候浪費時間,那麼我節約總結的時間來保證進度,那麼代價就是總結不詳細。但是有弊也有利,我現在很明確每一篇總結的重點,難點。因為寫的都是重點難點。
歡迎到微信裡去當吃瓜群眾