建構函式和析構函式

2021-10-03 09:55:07 字數 2639 閱讀 9647

每日文摘

我感冒了 ,因為我對你沒有抵抗力。

注意:程式會在物件銷毀前自動呼叫析構函式

1.析構函式通常作用是將在堆區開闢的記憶體釋放

2.先構造的後析構

按有參無參分為 :有參構造無參構造

按型別分:普通構造拷貝構造

class

stu//有參構造

stu(

int p)

//拷貝構造

stu(

const stu &p)

~stu()

};

反過來了

方法:

1.括號法(常用)

stu p;

//無參構造

stu p1(10

);//有參構造

stu p2

(p1)

;//拷貝構造

注意點:無參構造不能寫成這種 stu p() 構造器會認為這是函式的宣告2.顯試法

stu p1 = stu (10)

;//有參

stu p2 =

stu(p2)

;//拷貝

注意 stu(10)單獨寫就是匿名物件,當前結束後馬上析構3.隱試法

stu p1 =10;

//stu p1=stu(10)

stu p2 = p1;

//stu p2=stu(p1)

1.在預設情況下,編譯器會至少給乙個類提供三個函式

預設的構造引數無參,函式體為空

預設的析構函式無參,函式體為空

預設的拷貝建構函式,對屬性進行值拷貝

2.

2.1 如果使用者定義了有參建構函式,編譯器將不會定義預設無參建構函式,但會定義拷貝建構函式

2.2 如果使用者定義了拷貝建構函式,編譯器將不會定義任何建構函式

1.使用乙個建立完畢的物件來初始化乙個物件。

stu p(10

);stu p1

(p);

2.一值傳遞的方式給函式引數傳值。

void

f(stu p)

intmain()

函式f中的引數屬於值傳遞,在拷貝的途中,運用到了拷貝建構函式

3.一值方式返回區域性物件

stu  f()

intmain()

因為return是拷貝了乙份p,所以運用到了拷貝建構函式

淺拷貝是指預設拷貝建構函式對物件的成員進行簡單的值拷貝

但是淺拷貝會在一些情況下出現問題,我們看一下**

classp}

;int

main()

到這裡一切都是正常的,因為在建構函式p中用new在堆中開闢了一片記憶體·,需要手動去釋放。那麼加乙個析構函式去釋放

~p(

)

將這串**放到類p中,發現報錯了

這是問神魔呢?

淺拷貝會把指標變數的位址複製了,而物件p和p1都會呼叫析構函式(先呼叫p1然後p,函式先執行的後析構),

然而在第一次p1呼叫析構函式時,就已經將那塊記憶體釋放了,p再次呼叫時當然會報錯了。

這時就要用深拷貝了

p

(const p & p)

此時拷貝時會再開闢一款記憶體,所以析構時,將不會釋放同一塊記憶體了。

總結

淺拷貝:又稱值拷貝,將源物件的值拷貝到目標物件中去,本質上來說源物件和目標物件共用乙份實體,只是所引用的變數名不同,位址其實還是相同的。

深拷貝:拷貝的時候先開闢出和源物件大小一樣的空間,然後將源物件裡的內容拷貝到目標物件中去,這樣兩個指標就指向了不同的記憶體位置。並且裡面的內容是一樣的

建構函式和析構函式

建構函式沒有返回值,不能被顯示的呼叫。它是在定義物件時由系統自動執行的,而且只執行一次。如果沒有定義建構函式,系統會自動生成乙個建構函式,只是這個建構函式的函式體是空,沒有引數,也不執行任何初始化的操作。帶引數的建構函式 有一種簡練,方便的寫法 建構函式的引數初始化表 box int h,int w...

析構函式和建構函式

每個物件生成的時候都要完成物件的初始化,如設定屬性的初始值。c 中規定每個類都有乙個初始值,如果沒有,系統會產生乙個預設的建構函式。這個建構函式沒有任何引數,不做任何額外的工作。但往往我們會自己寫乙個建構函式,用來進行特殊的初始化工作。這樣的話,編譯器就不會再為其生成預設的建構函式。class 類名...

建構函式和析構函式

stock hot 因為資料部分的訪問狀態是私有的,程式不能訪問資料成員。建立stock的建構函式,由於需要為stock提供3個值,因此應為建構函式提供3個引數值,程式設計師可能指向設定company成員,而其他的設定為0 使用預設引數完成 宣告如下 stock const char co,int ...