缺省構造函數似乎很好理解,我們總結如下:
1.缺省構造函數是一種特殊的構造函數,它不帶任何參數。
2.如果類中沒有定義任何構造函數,編譯器會自動生成一個缺省構函數,隻是這個缺省構造函數什麼工作也不做。
3.最好讓每個類都擁有一個缺省構造函數,即使這個缺省構造函數什麼工作也不做。由於我們在類中定義了構造函數,編譯器就不會自動生成缺省構造函數了。之所以要這樣做,是為了保證在使用對象數組和創建派生類對象時,不會發生不必要的麻煩。
4.隻要有了缺省構造函數(無論是顯式定義的,還是編譯器自動生成的),則不用傳遞參數就可以說明對象。
5.在說明對象時,如果不想向構造函數傳遞參數,也千萬別加上空括號。
上麵的語句實際上說明了一個名為A的函數,它無參數,返回Location類型的對象。
6.如果一個構造函數的所有參數均帶有缺省值,那麼這個構造函數本質上也是缺省構造函數,原因在於調用它時可以不必傳遞任何參數。
四、析構函數
析構函數是與構造函數對應的成員函數。每當一個類對象寧開了它的作用域時,析構函數就被自動調用。它的作用是在一個對象被消除之前,執行必要的工作。
析構函數也是一種特殊的成員函數。與其它成員函數的區別在於:
1.析構函數必須和類同名,並且要在函數名前加一個(-),用來區別於構造函數。
2.析構函數不能帶任何參數P
3.不能為析構函數指定任何返回值(包括void類型)。
4.在一個類中隻能定義一個析構函數,不能重載析構函數。
5.每當對象被自動撤銷時,析構函數就會自動執行。
6.同理,若一個類中沒有聲明析構函數,則編譯器也要生成一個公有的析構函數。
例5.8為例4.5加上析構函數。當main()函數運行結束時,程序將為對象A調用析構函數,然後回收這個對象占用的內存。例中的析構函數實際上什麼也沒做,而析構函數的真正功能是進行對象撤銷前的掃尾工作。典型的例子是:如果在構造函數中申請了內存空間,那麼就要利用析構函數來釋放這個內存的空間。
例5.9類Chunk的構造函數Chunk()動態分配一塊大小為size的內存空間,析構函數Chunk()釋放這塊內存。
—般地,每當創建一個對象時,就要調用構造函數;每當撤銷一個對象時,就要調用析構函數。如下所述:
1.對於局部對象,當對象被聲明時,構造函數即被調用;當程序退出該對象說明所在的分程序時,即離開該對象的作用域時,析構函數被調用。
2.對於全局對象,當程序開始時,構造函數被調用;當程序結束時,析構函數被調用。
3.對於靜態對象,在第一次進入該靜態對象聲明所在的函數之前,函數被調用;當程序結束時,析構函數被調用。
5.3this指針
當成員函數(包括構造函數和析構函數)被調用時,程序自動向它傳遞一個隱含的指針,該指針用以指向該成員函數操作的對象,因此當某個對象調用成員函數時,該指針便指向這個對象。所以,不同的對象調用同一個成員函數時,編譯器依據這個指針來確定應該引用哪一個對象的數據成員。在程序中可以使用關鍵字來引用該指針。因此,稱該指針為this指針。this指針是一種特殊的指針,它可以用於訪問成員函數,當為某個對象
調用成員函數時,編譯器將該對象的地址賦給this指針,然後調用該函數。例如,Rect類的成員函數Move()被定義為:
其中,Myrect是Rect類型的對象。當main()函數執行Myrect.Move(10,20);語句時,就把10賦給對象Myrect的數據成員X,20賦給數據成員Y。
那麼,編譯器是怎麼知道該把10和20賦給對象Myrect的數據成員X和Y,而不是其它對象的數據成員呢?請看下麵的執行過程。
在成員函數Move(intx,inty)中,類成員X和Y並沒有指明是哪一個對象的。這時,編譯器認為X和Y是this指針所指向的對象中的成員。
當執行Myrect.Move(10,20)語句時,讓this指針指向對象Myrect,並把它作為一個隱含的參數傳遞給成員函數Move(),然後執行它的函數體:
而此時,x是10,y是20。所以,把10和20分別賦給對象Myrect的數據成員X和Y。這樣,當使用Move()操作不同的對象時,this指針也指向不同的對象。成員函數Move0就能夠操作不同對象的數據成員。
成員函數可以使用this指針測試參數傳遞的對象是否與為其調用了成員函數的對象相。成員函數Assign()用一個Location類的對象(參數P所引用的對象)的值更新它所操作的對象,該成員函數使用表達式this=p來判斷對象p的地址是否等於this指針的值。如果是的,表明程序試圖做自賦值,故函數不做任何事就退出,否則,就執行正常的賦值操作。
在執行A.Assign(A)操作時,this指針指向對象A,同時由於P也是引用對象A,所以,表達式&p也指向A。thb就等於p。這樣,就返回什麼也不做,而避免了無意義的更新。
對this指針有如下說明:
1.this指針是指向當前調用成員函數的對象的指針。this指針的類型是:類名*const this;
即this是一個常量指針。所以,在程序裏不能直接給這個指針賦值,但是可以給this指針的對象賦值。例如:
this=是不正確的。
*this=是正確的。
2.this作為一個隱含的參數自動傳遞給被調用的成員函數,並作用到成員函數直接使用的類成員上。換句話說,經過this指針的作用,成員函數中直接使用的類成員(數據成員和成員函數)指的是當前對象的成員。
3.在成員函數中可以直接引用this指針。
5.4舉例
例5.10類Grade描述的是學生情況的類,它的數據成員有兩個:姓名name和成績grade。成員函數getname()是獲取學生的姓名,getgrade()是獲取學生的分數,ispass0是判斷是否通過,printdata()是輸出學生情況。例5.11類Book用於推述圖書館書籍的有關信息,數據成員author記錄作者名,title記錄書名,rtatus記錄書的狀態。書的狀態有兩種:IN表示未被借B,OUT表示已借出。
例5.12類Complex描述的是複數類,它有兩個數據成員:複數的實部re和虛部im。成員函數set()設定re和im的值,show()顯不複數的值。成員函數add()執行兩個複數的加法,成員函數sub()執行兩個複數的減法。