1. 1、本文档共100页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
解构函式

第 9 章 建構函式與解構函式 本章提要 9-1 建構函式 (Constructor) 9-2 複製建構函式 9-3 解構函式 9-4 物件的陣列 9-5 成員初始化串列 9-6 綜合演練 9-1 建構函式 (Constructor) 當我們建立好一個類別之後, 便希望能將它當成一般的基本型別來使用, 而要達到這個目的, 必須靠一些特殊的函式成員來實作某些功能。其中建構函式的功用, 就是讓我們能像定義基本資料型別的變數一樣, 可以在建立物件同時就初始化資料成員的內容。 物件的初始化 當我們以基本型別來宣告變數時, C++ 的編譯器會自動根據其型別配置好記憶空間, 同時若有必要, 也會為它設定初值。而且我們也可在宣告變數時即指定初值: 當我們用類別來定義物件時, 編譯器也會依照類別的大小來配置記憶空間給這個物件。但用前一章所學的方法, 我們無法對物件做類似的初始值設定: 物件的初始化 物件的初始化 如果物件的資料成員是公開的成員, 則雖可利用大括號的方式設定物件初始值, 但這樣就失去資料封裝的意義了: 物件的初始化 如果希望使用私有資料成員的類別在建立物件時, 也能像定義資本資料型別的變數時一樣方便的設定初始值, 甚至要物件做其它額外的準備工作, 只需在類別中定義必要的建構函式即可, 首先要介紹的是預設建構函式。 預設建構函式 建構函式也是成員函式, 但它和一般成員函式有兩點最大的不同:建構函式必須與類別同名, 而且不能有任何的傳回值。即使我們未替類別設計任何的建構函式, 編譯器仍會為類別定義一個預設建構函式 (Default Constructor), 也就是不需傳遞任何參數即可呼叫的建構函式, 例如: 預設建構函式 預設建構函式 當我們宣告新的物件時, 這個預設建構函式就會被呼叫, 只不過由於編譯器自動產生的預設建構函式中並沒有執行什麼特別的動作, 所以感覺好像根本沒有預設建構函式一樣。我們可用以下的範例來檢視建構函式被呼叫的情形。為了瞭解建構函式被呼叫的時點, 我們故意將預設建構函式的內容重新定義成只輸出一段訊息: 預設建構函式 預設建構函式 預設建構函式 在第 14 行先宣告 2 個 Time 物件, 接著在第 16 行宣告指向物件的指標、第 18 行宣告指標並用 new 運算子配置 1 個物件。由執行結果可以發現, 只有第 16 行宣告指標的動作未引發建構函式, 其它敘述由於都會建立實際的物件, 所以都會自動呼叫建構函式來做初始化的動作。因此我們可以瞭解, 系統會在建立物件時自動呼叫建構函式, 我們只需將需要初始化的敘述寫在建構函式中讓系統呼叫即可, 不需自行呼叫建構函式。 預設建構函式 請注意第 6 行的 Time() 函式原型並未宣告傳回值型別, 連 void 也未指定, 這是因為建構函式本來就規定不能有傳回值, 所以連 void 都可省了。如果在建構函式前面加上 void 關鍵字, 反而會造成編譯錯誤。 若類別中有其它類型的資料成員, 例如其它類別的物件, 則在呼叫預設建構函式之前, 會先呼叫成員物件的建構函式, 請參考以下的例子: 預設建構函式 預設建構函式 預設建構函式 在 main( ) 函式並未建立 Time 物件, 但由執行結果可以發現, Time 的建構函式被呼叫了 2 次!這是因為 Clock 類別有 2 個資料成員都是 Time 類別的物件, 所以編譯器會先呼叫 Time 的建構函式來建構這 2 個成員物件, 接著才呼叫 Clock 自己的預設建構函式。因此當我們用 Clock 類別建立物件時, 就會引發 Time 的建構函式被執行 2 次, 接著才會執行 Clock( ) 預設建構函式。 預設建構函式 由於預設建構函式一定會在建立物件時被呼叫 (除非我們呼叫其它版本的建構函式), 所以最適合用來做最基本的初始化動作, 例如將資料成員都設定一個有意義的初始值等等。例如我們就可將前述 Time 類別的預設建構函式改寫成如下的樣子: 預設建構函式 預設建構函式 預設建構函式 除了用來初始化資料成員外, 我們也可在建構函式中做其它的處理, 舉例來說, 如果類別需要隨時記錄共有幾個物件存在, 此時可用一個靜態資料成員來記錄物件的總數, 並在建構函式中每次都將這個數值加 1, 以記錄目前存在的物件數量。 預設建構函式 預設建構函式 預設建構函式 上列程式在第 7 行宣告靜態資料成員 counter 以記錄物件總數, 並在第 15 行定義初始值為 0, 第 6 行的預設建構函式中, 則是將 counter 的值遞增, 所以每建立一個物件, counter 的值就會加 1 因此程式中建立含 10 個 Car 物件元素的陣列後, counter 的值就變成 10 再用 new 運算子建立一個物件

文档评论(0)

magui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档