結構函式和析構函式就是分別用於物件的初始化和清理,在我們不提供結構函式和析構函式時,編譯器會提供結構函式和析構函式,但是是空實現。
主要用於在建立物件時,為物件的成員屬性賦值,結構函式由編譯器自動呼叫,無需手動呼叫
結構函式又分為:無參結構函式、有參結構函式和拷貝結構函式
無參結構函式:即結構函式無引數 類名();
有參結構函式:即結構函式有引數 類名(型別 變數,型別 變數 …);
拷貝結構函式:即將這份物件屬性,拷貝到另乙個物件乙份 類名(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來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...