1. 程式人生 > >類——定義抽象資料型別

類——定義抽象資料型別

《C++Primer》v5讀書筆記

使用類定義自己的資料型別。通過定義新的型別來反映待解決問題的各種概念,可以使我們更容易編寫、除錯和修改程式。類的基本思想是資料抽象和封裝。

資料抽象是一種依賴於介面和實現分離的程式設計技術。類的介面包括使用者所能執行的操作;類的實現則包括類的資料成員、負責介面實現的函式以及定義類所需的各種私有函式。

封裝實現了類的介面和實現的分類。封裝後的類隱藏了它的實現細節,類的使用者只能使用介面而無法訪問實現部分。

抽象資料型別能幫助我們將物件的具體實現和物件所能執行的操作分離開來。

 

設計類的介面時,應該考慮如何實現使用者的需求,考慮如何才能使得類易於使用;使用類的介面時,不應該顧及類的實現機理。

定義成員函式的方式與普通函式差不多。成員函式的宣告必須在類的內部,它的定義則可在類的內部或外部。

 定義在類內部的函式是隱式的inline函式。

 

1、引入this

 成員函式通過一個名為this的額外的隱式引數來訪問呼叫它的那個物件。當我們呼叫一個成員函式時,用請求該函式的物件地址初始化this。例如,如果呼叫

total.isbn()

則編譯器負責把total的地址傳遞給isbn的隱式形參this。

this是一個常量指標,我們不允許改變this中儲存的地址。

 

2、引入const成員函式

std::string isbn() const {return bookNo;}

const的作用是修改隱式this指標的型別。預設情況下,this的型別是指向類型別非常量版本的常量指標。因為在isbn函式體內不會改變this所指向的物件,把this設定為指向常量的指標有助於提高函式的靈活性。

像這樣使用const的成員函式被稱作常量成員函式

常量物件,以及常量物件的引用或指標,都只能呼叫常量成員函式。

 

3、類作用域和成員函式

類本身就是一個作用域,類的成員函式的定義巢狀在類的作用域之內。

編譯器分兩步處理類:首先編譯成員的宣告,然後才輪到成員函式體。當我們在類的外部定義成員函式時,成員函式的定義必須與它的宣告匹配。

 一般來說,如果非成員函式時類介面的組成部分,則這些函式的宣告應該與類在同一個標頭檔案中。

 

4、建構函式

 

每個類都分別定義了它的物件被初始化的方式,類通過一個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫建構函式。

建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。

建構函式的名字和類名相同,和其他函式不一樣的是,沒有返回型別;

與其他函式類似,建構函式也有一個(可能為空的)引數列表和一個(可能為空的)函式體;

類可以包括多個建構函式,和其他過載函式差不多,不同的建構函式之間必須在引數數量或型別上有差別;

建構函式不能被宣告為const的。當建立類的一個const物件時,直到建構函式完成初始化過程,物件才真正取得其“常量”特性。

 預設建構函式

類通過一個特殊的建構函式來控制預設初始化過程,這個函式叫做預設建構函式。

預設建構函式無須任何實參。

只有當類沒有生命任何建構函式時,編譯器才會自動生成一個預設的建構函式。

如果類包含有內建型別或者複合型別的成員,則只有當這些成員全都被賦予了類內的初始值時,這個類才適合於使用合成的預設建構函式。

 建構函式初始值列表

Sale_data(const std::string &s):bookNo(s){ }

Sale_data(const std::string &s, unsigned n,double p):

          bookNo(s),units_sole(n),revenue(p*n) { }

建構函式的唯一目的是為資料成員賦值,一旦沒有其他任務需要執行,函式體就為空。

在類的外部定義建構函式

Sale_data::Sale_data(std::istream &is){

return(is,*this)     //read函式的作用是從is中讀取一個交易資訊

                    //然後存入this物件中

}

當在類的外部定義建構函式時,必須指明該建構函式時哪個類的成員。因為該成員的名字同類名相同,所以它是一個建構函式。

 

 5、拷貝、賦值和構析

很多需要動態記憶體的類能使用vector或string物件管理必要的儲存空間。使用vector或string的類能避免分配和釋放記憶體帶來的複雜性。

如果類包含vector或string成員,則其拷貝、賦值和銷燬的合成版本能夠正常工作。

 在學習第十三章拷貝控制 關於如何自定義操作的知識之前,類中所有分配的資源都應該直接以類的資料成員的形式儲存。

 ,只有被編譯器需要的預設建構函式,編譯器才會合成它。