一般來說,每次都是建立乙個物件,再在類的公有函式裡設定資訊,那能不能在建立函式的同時設定資訊呢???
建構函式是乙個特殊的成員函式,主要作用是初始化物件的記憶體空間。
雖然稱為建構函式,但是其核心並不是開空間建立物件,而是對物件記憶體空間的初始化。
(1)函式名與類名相同
(2)無返回值
(3)物件例項化時編譯器自動呼叫對應的建構函式
我們都知道類的成員方法(建構函式和析構函式)是依賴物件呼叫的,而建構函式是初始化物件所佔空間的,那就會造成這樣乙個問題:如果使用者能手動呼叫建構函式,那物件就要先生成,那物件要生成就要先呼叫建構函式,所以如果手動呼叫建構函式就會造成雞生蛋還是蛋生雞的問題???
所以建構函式是不能手動呼叫的,由編譯器自動呼叫。
(4)建構函式可以過載
建構函式是在對不同物件的記憶體空間進行初始化,而不同的物件就需要多個建構函式進行定義,所以建構函式是可以過載的。
(5)在物件的生命週期內只呼叫一次
(6)每個建構函式都有預設建構函式
如果類中沒有顯式定義建構函式,那麼c++編譯器會自動生成乙個預設建構函式,一般來說預設建構函式就是乙個什麼也沒有的函式。同時無參或者預設的建構函式也稱為預設建構函式。但是如果已經定義了建構函式,編譯器就不會在生成預設建構函式。
那麼就有人問了:那既然什麼也沒有,那執行後也就是隨機值,那預設建構函式有什麼用???
原因是:
在c++中,把型別分成了基本型別和自定義型別。
基本型別就是語法已經定義好的型別,例如:int、char等。
自定義型別是使用者使用class / struct / union 自行定義的型別。
當使用者自定義型別成員時,預設建構函式就會對它呼叫它的預設建構函式。擁有預設建構函式後,可以宣告物件,而不初始化它。
class
time
private
:int _hour;
int _minute;
int _second;};
class
date
;int
main()
析構函式不是完成物件的銷毀,區域性物件的銷毀是由編譯器完成的,而物件在銷毀時自動呼叫析構函式完成類的資源清理工作。
所以析構函式主要工作是釋放物件所佔資源的。
(1)析構函式是在類名前加上 ~
(2)無引數無返回值
(3)乙個類只有乙個析構函式,即析構函式不能過載。
(4)物件生命週期結束時,c++編譯器會自動呼叫預設析構函式,使用者也可以手動呼叫,但一般不建議。
原因是:
在析構函式呼叫前,物件已經生成,如果使用者手動呼叫析構函式後,它就變成了乙個普通的成員方法,而普通的成員方法只是把物件所佔資源釋放了,但物件依然存在,當物件生成週期到了之後,系統還會呼叫一次析構函式來釋放資源,那就導致同一塊記憶體被釋放了兩次。
所以析構函式可以手動釋放,但是不建議。
class
cgoods
~cgoods()
private
:char
* _name;
float _price;
int _amount;};
intmain()
1、在進行指標的初始化時,不能直接寫成_name = name
,如果寫成這樣就是字串進行直接賦值,那在實現時如果字串不等長,就會出錯。所以要進行動態開闢記憶體,c++用new。
2、物件生成時:
(1)物件開闢記憶體
(2)系統自動呼叫建構函式
3、物件釋放時:
(1)呼叫析構函式(釋放堆上所佔記憶體)
(2)釋放物件所佔記憶體
4、物件是在棧上開闢,而物件中new開闢的記憶體是在堆上
(1)棧上系統開闢,系統釋放、
(2)堆上使用者開闢,使用者釋放
C 建構函式和析構函式
1.建構函式是類的一種特殊方法,每次建立類的例項都會呼叫它。在建立乙個類的例項時,建構函式就像乙個方法一樣被呼叫,但不返回值。語法格式 訪問修飾符 類名 特性 1 其名字必須與類名相同,例如 public class myclass 2 不能被直接呼叫,必須通過new運算子來 呼叫。publiccl...
C 建構函式和析構函式
建構函式 class rectangel rectangel int l,int w 這是帶引數的建構函式,建構函式都是沒有返回值,並且和該類同名 int area 這是另一種形式的內聯函式,把宣告和定義寫在一起的也是內聯函式 private int length int width 析構函式 cl...
c 建構函式和析構函式
1.c 的建構函式有預設建構函式,一般的建構函式,賦值建構函式,拷貝建構函式 複製建構函式 強制型別轉化建構函式。2.如果沒有定義建構函式和析構函式,則c 編譯器會按照 位拷貝 的方式提供預設的建構函式 不初始化 預設的賦值建構函式 淺賦值 預設的拷貝建構函式 淺拷貝 預設的析構函式。位拷貝要小心指...