13圖解析C++構造函數和析構函數

前言

上一章節主要是詳細介紹了C++中的類和對象。不清楚的能夠回顧一下哦。本章節主要針對於C++構造函數和析構作以詳細介紹。編程

構造函數

構造函數是C++類中的一個特殊的函數,主要有如下特色:數組

  • 構造函數的名字必須與類名相同微信

  • 構造函數沒有返回值。app

  • 構造函數也是特殊的成員函數,編輯器

  • 構造函數能夠重載函數

  • 構造函數通常被聲明爲公有函數this

  • 默認構造函數:不寫構造函數,存在無參的構造函數url

  • 動調用:構造對象時被調用spa

  • 調用順序:建立對象時調用構造函數.net

故咱們能夠寫出以下代碼:

寫一個構造函數就是這麼簡單的哦!

談談默認構造函數

當咱們不寫構造函數的時候,爲何能夠建立對象,是由於不寫構造函數,存在一個無的構造函數,因此咱們能夠構造無參對象。其實這個默認的函數咱們能夠刪除掉的,經過C++delete 提供的函數去刪除默認的函數,這樣的就沒法建立對象了。或者你把構造函數私有化也是能夠的。

從這一點上來看,能夠驗證默認的構造函數其實也是無參的。

談談構造函數與對象的建立

構造函數一般是用來建立對象,也能夠理解爲對象的屬性初始化也能夠。而且構造函數決定了對象的長相,構造函數是無參的調用無參構造函數,對象一個參數,構造的對象也就只有一個參數。依次類推要保持一致性。

因此通常狀況咱們爲了構建不一樣的對象,習慣於把構造函數寫成缺省的形態,這樣就方便了咱們構建不一樣的對象。


談談new一個對象的過程

new一個對象實際上是兩個過程:

  1. new一個無名對象

  2. 把無名對象的首地址給對象指針

因此new一個對象的時候也須要和構造函數的參數一致,如如下代碼:

談談拷貝構造函數

默認拷貝構造函數

拷貝構造函數也是構造函數,因此也能夠用來構造對象的,通常不寫拷貝構造函數也是能夠使用默認的拷貝構造函數去實現對象的建立,拷貝構造函數只有惟一的一個參數就是對對象的引用,經過拷貝構造函數建立對象的時候須要傳入一個參數,以下代碼:



本身也是能夠寫一個拷貝構造函數,以下代碼:

這裏this表明的是全部類對象的抽象地址,描述每個類的想的行爲,*this表示對象自己,實現object拷貝到*this。值得一提的是在定義過程中的賦值運算也是調用拷貝構造函數:


注意普通的賦值運算並不會調用拷貝構造函數以下代碼:

析構函數

析構函數也是C++類中的一個特殊的函數,主要有如下特色:

  • 析構函數的名字必須~類名

  • 析構函數沒有返回值。

  • 析構函數沒有參數,因此不可重載。

  • 動調用:析構函數在對象死亡調用

  • 調用順序:通常狀況和建立順序相反

何時須要寫析構函數呢?通常當類中的數據成員進行了內存的申請過程,通常都是須要本身手動寫析構函數的,如一下代碼:

上述代碼主要有三部分組成

  1. 構造函數中:給予屬性name申請內存

  2. 主函數中:{}能夠提前限制對象的做用域

  3. 析構函數中:釋放申請的內存

深拷貝和淺拷貝

爲何有深拷貝和淺拷貝?主要是在使用拷貝構造函數的時候,對一段內存重複釋放,致使析構問題,如一下代碼:

由於這兩個個對象的name屬性都是指向同一個內存,因此重複釋放內存致使了析構問題。因此纔要使用深拷貝去解決這個問題,深拷貝其實很簡單,就是在拷貝構造函數中另外申請一段內存,讓對象擁有本身的專屬內存,實際代碼以下:

各自有各自的內存,互不干擾,完美解決問題。

構造順序和析構順序

通常狀況是構造順序和析構順序正好是相反的,如一下代碼


其實很簡單,若是你明白變量的做用域其實就很容易理解調用順序的。普通對象構造順序和析構順序正好是相反的,new出來的對象,釋放完後就會調用析構函數,靜態對象,程序關閉後調用,因此上圖沒有顯示出來4的析構過程。

對象數組問題

對象數組其實自己就是多個普通的對象,因此當不存在無參的構造函數時候不能構建無參的數組對象,如一下代碼:

因此咱們要像在C語言中那樣建立數組的話, 都會準備一個無參的構造函數,或者是採用缺省的方式編寫構造函數。

尾言

關於類的組合問題,咱們下個章節探討,本節課就到這裏了,本章節做業: 用C++類的方式實現C語言中的單鏈表。

上一章節:C++類和對象

C++教程第03課:一文學會建立類和對象

C++教程第02課:一文學會C++string類

C++教程第01課:一文學C++與C的區別(二)

C++教程第01課:一文學C++與C的區別(一)

本文分享自微信公衆號 - C語言編程基礎(goodStudyCode)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索