7 學習C 之類的建構函式

2022-07-14 09:09:08 字數 2512 閱讀 5443

1.常見的建構函式

c++的類在建立物件的時候,都會去呼叫建構函式,這種行為是強制的。如果在類中沒去寫建構函式,程式會自動為你的類建立出建構函式,然後去呼叫他(這個建構函式的函式體是空的,也沒有形參,也不執行任何操作。);如果你已經寫了建構函式,那麼程式在執行的時候會去呼叫你寫的建構函式。

建構函式是可以被過載的,乙個類可以有多個過載的建構函式,建立物件時根據傳遞的實參來判斷呼叫哪乙個建構函式。

建構函式中又細分出缺省建構函式,具體區別有三言兩語不好去說明,還是直接上圖比較好:

(感覺這塊知識點除了學生在期末考試會考到,其他地方真能用到麼)

如果看了上圖還不能理解,只能放**了

class

student

//無參建構函式,預設建構函式

student():m_strname("

jim"),m_iage(10){}//

無參建構函式,預設建構函式

/*student(string _strname,int _iage)//無參建構函式,引數不帶預設值,不是預設建構函式

*/student(

string _strname,int _iage):m_strname("

jim"),m_iage(10)//

無參建構函式,引數帶預設值,是預設建構函式

private

:

string

m_strname;

intm_iage;

}

2.拷貝建構函式定義格式:類名(const 類名& 變數名)

要點1:如果沒有自定義的拷貝建構函式,系統會自動生成乙個預設的拷貝建構函式。

要點2:當採用直接初始化或複製初始化例項化物件時系統會自動呼叫拷貝建構函式。

要點3:拷貝建構函式不能被過載。

要點4:拷貝建構函式在引數傳遞的時候也會被呼叫。

老慣例,上**

class

abc;

abc(

const abc &aaa){}

private

:

inta;

}void

text(abc aa3)

intmain()

3.深拷貝和淺拷貝其中拷貝建構函式分為淺拷貝和深拷貝,繼續按照慣例上**:

#include using

namespace

std;

class

text

; text(

const text &aa):t_a(aa.t_a),t_b(aa.t_b){};//

淺拷貝private

:

intt_a;

intt_b;

};int

main()

在上面的**中,b就是依靠拷貝的方式初始化的,就是將 a 所在記憶體中的資料按照二進位制位(bit)複製到 b 所在的記憶體,這種預設的拷貝行為就是淺拷貝。

有淺就有深,既然有了淺拷貝,那麼肯定就會有深拷貝。淺拷貝有它的缺陷,在遇到動態分配的記憶體、指向其他資料的指標的情況時,就會出現一些bug,甚至會導致程式的崩潰。下面上乙個本該用深拷貝卻用淺拷貝的錯誤**:

#include using

namespace

std;

class

array

; array(

const array &aa)

;private

:

intm_icount;

int *m_parr;

};int

main()

在上面的**中,a的成員變數m_parr是個指向動態分配記憶體的陣列的第乙個位址的指標,經過淺拷貝,b的成員變數m_parr也是指向著相同位址,這會導致修改b的陣列時,a的陣列也會跟著發生變化,當a銷毀的時候,b的指標指向的陣列則不存在,等等許多問題。所以我們需要作出一些改變來應對這種情況,於是深拷貝應運而生。

按照慣例,放出修改後的**:

class

array

; array(

const array &aa)

};private

:

intm_icount;

int *m_parr;

};

這種將物件所持有的其它資源一併拷貝的行為叫做深拷貝,我們必須顯式地定義拷貝建構函式才能達到深拷貝的目的。

所以,什麼時候用深拷貝什麼時候用淺拷貝呢?

如果乙個類擁有指標型別的成員變數,那麼絕大部分情況下就需要深拷貝,因為只有這樣,才能將指標指向的內容再複製出乙份來,讓原有物件和新生物件相互獨立,彼此之間不受影響。如果類的成員變數沒有指標,一般淺拷貝足以。

C 學習7 建構函式

當建立乙個物件時,往往需要做一些初始化工作,例如對資料成員賦值等。為了解決這個問題,c 提供了建構函式。建構函式 constructor 是一種特殊的成員函式,它的名字和類名相同,沒有返回值,不需要使用者呼叫 使用者也不能呼叫 而是在建立物件時自動執行。建構函式的作用是在建立物件時進行初始化工作,最...

C 學習之類的構造方法

根據例子來學習吧using system.collections.generic using system.linq using system.text namespace 02類的練習 這裡是讀取內容 set 這裡是寫入內容 private char gender public char gend...

C 之類建構函式與析構函式

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。class aa a void 使用初始化列表來初始化字段 line line double len len...