C 結構函式和析構函式

2021-10-03 06:06:32 字數 1593 閱讀 6759

結構函式和析構函式就是分別用於物件的初始化和清理,在我們不提供結構函式和析構函式時,編譯器會提供結構函式和析構函式,但是是空實現。

主要用於在建立物件時,為物件的成員屬性賦值,結構函式由編譯器自動呼叫,無需手動呼叫

結構函式又分為:無參結構函式、有參結構函式和拷貝結構函式

無參結構函式:即結構函式無引數 類名();

有參結構函式:即結構函式有引數 類名(型別 變數,型別 變數 …);

拷貝結構函式:即將這份物件屬性,拷貝到另乙個物件乙份 類名(const 類名 & 變數);

拷貝結構函式:

拷貝結構函式呼叫時的三種情況:(已建立好乙個peoper類)

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

//1.用乙個建立好的物件來初始化乙個新物件

peoper p1(18

);peoper p2

(p1)

;

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

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

void

fun2

( peoper p)

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

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

peoper fun3()

拷貝結構函式分為淺拷貝結構函式和深拷貝結構函式;淺拷貝結構函式:就是將物件的屬性簡單的拷貝給另乙份;

深拷貝結構函式:在堆區重新申請空間,進行拷貝操作;

在堆區申請空間需要用new關鍵字,並且要拷貝的物件屬性需要是指標形式,因為是在堆區申請的空間所以需要手動用關鍵字delete釋放。

class

peoper

peoper

(const peoper & p)

~peoper()

//析構結構函式,釋放記憶體

cout <<

"析構函式"

<< endl;

}int p_age;

int*p_height;

};

注意:如果屬性是在堆區開闢的,一定要自己提供拷貝建構函式,防止淺拷貝帶來的問題。

解釋:因為屬性是在堆區開闢的,簡單的淺拷貝只是對棧區的資料進行了完全拷貝,就會出現兩個物件的屬性指向同一塊堆區記憶體,這樣在進行析構函式時,與乙個位址會被釋放兩次,編譯器會報錯。這時可以通過自己提供拷貝建構函式,將物件的屬性和堆區的記憶體都進行了一次拷貝,這時兩個物件屬性是兩個不同位址但是指向是同樣資料。

c++編譯器至少給乙個類新增三個函式

結構函式呼叫規則:

1.如果使用者定義了有參建構函式,c++不在提供無參建構函式,但是會提供 預設拷貝建構函式

2.如果使用者定義了拷貝建構函式,c++不在提供其他建構函式

主要用於物件銷毀前系統自動呼叫,執行一些清理工作

結構形式:~ 類名()

C 封閉類的結構函式和析構函式的呼叫順序

program 12.6.2.cpp 封閉類的結構函式和析構函式的呼叫順序.include using namespace std class ctyre ctyre class cengine constructor n.建構函式 構造器 建造者 cengine destructor 美 d st...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...