天天看點

c++課件筆記:構造函數;.析構函數;拷貝構造函數;運算符重載;【c++】必須在類初始化清單中初始化的幾種情況;const成員的調用

大堆隻能進行從小到大的排序,小堆隻能進行從大到小的排序。

1.構造函數:

  • 構造函數是一個特殊的成員函數,名字與類名相同,建立類類型對象時由編譯器自動調用,保證每個資料成員都有一個合适的初始值,并且在對象的生命周期内隻調用一次。
  • 構造函數是特殊的成員函數,需要注意的是,構造函數的雖然名稱叫構造,但是需要注意的是構造函數的主要任務并不是開空間建立對象,而是初始化對象。

特征:

  1. 函數名與類名相同。
  2. 無傳回值。
  3. 對象執行個體化時編譯器自動調用對應的構造函數。
  4. 構造函數可以重載。

一但顯式定義了有參構造函數,那麼構造無參構造函數也需要自己顯式給出,一但顯式定義了拷貝構造函數,那麼其他函數也需要顯式給出。

2.析構函數:

析構函數是特殊的成員函數。

析構函數:與構造函數功能相反,析構函數不是完成對象的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調用析構函數,完成類的一些資源清理工作。

  1. 析構函數名是在類名前加上字元 ~。
  2. 無參數無傳回值。
  3. 一個類有且隻有一個析構函數。若未顯式定義,系統會自動生成預設的析構函數。
  4. 對象生命周期結束時,C++編譯系統系統自動調用析構函數。析構函數不可以重載

3.拷貝構造函數:

構造函數:隻有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象建立新對象時由編譯器自動調用。

  1. 拷貝構造函數是構造函數的一個重載形式。
  2. 拷貝構造函數的參數隻有一個且必須使用引用傳參,使用傳值方式會引發無窮遞歸調用。
  3. 若未顯示定義,系統生成預設的拷貝構造函數。 預設的拷貝構造函數對象按記憶體存儲按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝。

4.運算符重載

  • 不能通過連接配接其他符号來建立新的操作符:比如operator@ 重載操作符必須有一個類類型或者枚舉類型的操作數
  • 用于内置類型的操作符,其含義不能改變,例如:内置的整型+,不能改變其含義
  • 作為類成員的重載函數時,其形參看起來比操作數數目少1成員函數的 操作符有一個預設的形參this,限定為第一個形參
  • .* 、::、sizeof 、?: 、. 注意以上5個運算符不能重載。這個經常在筆試選擇題中出現。
  • 當在類内進行函數重載的時候,還有一個this指針,預設在第一個參數的位置。

當我們在進行重載的時候,加入将運算符重載定義成全局的函數,那麼如果要通路類内的成員變量,就需要類内的成員變量是公有的,那麼封裝特性又該怎麼辦?其實我們可以将他們設定為類内的函數,或者使用全局函數做友元(好基友當然可以随便通路了)。

5.【c++】必須在類初始化清單中初始化的幾種情況

  1. 類成員為const類型
  2. 類成員為引用類型
  3. 類成員為沒有預設構造函數的類類型(有顯式的拷貝構造,那麼類就不會提供無參構造函數和有參構造函數,這個時候假如類内的成員是類類型的成員,這時候就必須在初始化清單的位置初始化)
  4. 如果類存在繼承關系,派生類必須在其初始化清單中調用基類的構造函數

6.const成員的調用

1.const類型對象隻能調用const類型的函數

2.非const類型對象可以調用非const類型的函數和const類型的函數

3.const類型成員函數隻能調用const類型的函數

4.非const類型成員函數可以調用非const類型的函數,和const類型的函數。