由始至終
----構造與析構
作者:HolyFire
我們在平時的生活中一般會總結出一些規律,早上起床會刷牙洗臉,晚上會洗澡睡覺,這些都成了慣例。使用瓶裝調味品時先將瓶蓋打開,用完後將瓶蓋蓋上。這是一種好習慣。但是有些人不同,他們往往偷懶,一個常常不刷牙不洗臉不洗澡的人會有體味,東西放得亂七八糟的人生房間很不整潔。這些都是我們不希望看到的。當然編程中我們也不希望代碼亂七八糟。
使用一個未初始化的變量簡直就是災難,使用一個未初始化的指針將導致崩潰。這是我的忠告。在C++中初始化不會有附加的效果,不會降低效率,我們要做的是養成好習慣,產生一個對象的時候就將它初始化。
對於
Object.Init();
Object.Free();
這樣的調用並不是很困難,要記住他也不是難事,但是誰都不能保證他永遠不會忘記,更糟糕的是
Object.Init();
Object.Free();
沒有配對使用
Object.Init();
Object.Free();
Object.Free();
或
Object.Init();
Object.Init();
Object.Free();
會帶來什麼樣的結果,誰也不知道,而且這樣的錯誤,編譯器不會報錯。這是多麼可怕的錯誤,一個程序員最怕遇上的就是這樣的邏輯錯誤,它可能為了找這樣的一個錯誤花上一整天時間。
讓我們看看有什麼好的辦法。
一個對象按時間來分析,一般有三個階段,出生,活動,死亡。與我們要做的有什麼相關之處呢,初始化,運行,釋放。很好,對照一下,我們發現在對象出生的時候初始化,死亡的時候釋放,如果這一切能用這樣的機制來操作,我們就再也不用擔心會由於忘記或錯誤的使用帶來麻煩了。
C++裡就提供了這樣的機制。使用他有個約定
class Object{
public:
Object(); //與類同名的函數,該函數沒有返回值,叫做構造函數
~Object(); //類似的,在構造函數名前加一個取反符號,叫做析構函數
};
構造函數將在對象產生的時候調用
析構函數將在對象銷毀的時候調用
調用的過程和實現方法由編譯器完成,我們只要記住他們調用的時間就行了,而且他們的調用是自動完成的,不需要我們控制。
#include <iostream>