1. 程式人生 > >C++第十二章筆記

C++第十二章筆記

動態記憶體和類

動態記憶體如此靈活,在類中也十分常用。

如果在建構函式的時候使用new,那麼無論是構造,賦值,複製,析構都需要注意

如果在類中有個static靜態成員變數,便可以在類外用作用域解析運算子直接賦值,但是要指出變數型別,如:

int A::num = 0;

如果靜態成員是const或者列舉,則可以在類宣告初始化。

在複製,賦值過程中,可能會用到臨時變數,如果在類中存在動態記憶體,那麼給一個物件賦值時,是一個臨時變數給這個物件賦值,過程:

  1. 建立臨時變數,其中包括以後指向動態記憶體空間的指標
  2. 將臨時變數成員依次賦值給要賦值的物件
  3. 釋放臨時變數,包括釋放那段動態記憶體

很明顯,這樣形成了一個野指標。而這個複製過程被成為淺賦值。也就是由編譯器預設複製建構函式實現的。但是,對於使用動態記憶體的類來說,這樣明顯是有問題了。因此,要使用深度複製。

深度複製就是使用複製建構函式和過載賦值運算子。

靜態類成員函式

可以將成員函式宣告為靜態的(函式宣告包含關鍵字static)

  1. 不能通過物件呼叫靜態成員函式
  2. 靜態成員函式甚至不能使用this指標
  3. 如果靜態成員函式是在共有部分宣告的,則可以使用類名和作用域解析運算子來呼叫它
  4. 由於靜態成員函式不與特定的物件相關聯,因此只能使用靜態資料成員
  5. 可以使用靜態成員函式設定類級標記,以控制某些類介面的行為

在建構函式中使用new時應注意的事項

  1. 如果在建構函式中用了new,則應在解構函式中使用delete
  2. 如果使用new[],那應該使用delete[]
  3. 如果有多個建構函式,應該使用相同的new格式,因為只有一個解構函式,要保證相容性
  4. 應該定義一個賦值建構函式,通過深度複製講一個物件初始化為另一個物件(初始化,形參呼叫)
  5. 應該定義一個賦值運算子,通過深度複製將一個物件賦值給另一個物件

指標和物件之間的使用,和指標和結構體等的使用方式相同。善待指標!

為了防止隱式轉換可以使用explicit關鍵字。

初始化列表

應該是一個星期前,韓祥波老師把我叫講臺上做一個關於初始化列表的題,不過到現在我才知道什麼是初始化列表= =。

其實就是C++為const常量初始化的一種方式,只能用在建構函式上。

如果Queue類中有個叫qsize的常量,常量除了初始化是不允許被賦值的,那麼就使用初始化列表進行初始化:

Queue (int qs):qsize(qs)
{
...
}

其他變數也可以用初始化列表進行初始化。其初始化的順序和類宣告中的順序相同,和初始化列表的順序無關。

C++11給diao,他可以在類宣告中,直接初始化,甚至就是直接預設引數。

就像之前說的,就是在總結的時候浪費時間,那麼我節約總結的時間來保證進度,那麼代價就是總結不詳細。但是有弊也有利,我現在很明確每一篇總結的重點,難點。因為寫的都是重點難點。


歡迎到微信裡去當吃瓜群眾