定義抽象資料型別

2022-06-21 15:00:11 字數 3260 閱讀 7618

更多類的基本概念

對於抽象資料型別來說,我們通過它的介面來使用它的物件而不知道這個類有哪些資料成員。與之相反,若乙個類允許他的使用者直接訪問他的資料成員,並且要求由使用者來編寫操作,則這個類不是乙個抽象資料型別。

設計類

類的介面包括使用者所能執行的操作;類的實現則包括類的資料成員、負責介面實現的函式體以及定義類所需的各種私有函式。

定義類

定義成員函式:

定義和宣告成員函式的方式與普通函式差不多。成員函式的宣告必須在類的內部,他的定義則既可以在類的內部也可以在類的外部。類外部定義的成員的名字必須包含它所屬的類名。

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

引入this:

當我們呼叫乙個成員函式時,用請求該函式的物件的位址初始化this。

在成員函式內部我們可以直接使用呼叫該函式的物件的成員,而無須通過訪問運算子做到這一點,因為this所指的正是這個物件。任何對類成員的直接訪問都被看作this的隱式引用。

因為this的目的是總是指向「這個」物件,所以this是個常量指標,不允許改變this中儲存的位址。

引入const成員函式:

緊隨引數列表之後的const關鍵字的作用是修改隱式this指標的型別。

預設情況下,this的型別是指向類型別非常量版本的常量指標。因為this需要遵循初始化規則,所以(在預設情況下)不能把this繫結到乙個常量物件上。這一情況使得我們不能在乙個常量物件上呼叫普通的成員函式。

如果乙個函式不會改變this所指的物件,則把它設定為指向常量的指標有助於提高函式的靈活性。

緊跟在引數列表後面的const表示this是乙個指向常量的指標。像這樣使用const的成員函式被稱為常量成員函式。常量成員不能改變呼叫它的物件的內容。常量物件,以及常量物件的引用或指標都只能呼叫常量成員函式。

類作用域和成員函式:

類本身就是乙個作用域。

編譯器分2步處理類:首先編譯成員的宣告,然後才輪到成員函式體。因此,成員函式體可以隨意使用類中的其他成員而無須在意這些成員出現的次序。

定義乙個返回this物件的函式:

在設計類似復合賦值運算子+=時,函式最後「return *this;"。

一般來說,當我們定義的函式類似於某個內建運算子時,應該令該函式的行為盡量模仿這個運算子。

定義類相關的非成員函式

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

建構函式

每個類都分別定義了他的物件被初始化的方式,類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。

建構函式的名字和類名相同。和其他函式不一樣的是,建構函式沒有返回型別;除此之外類似於其他函式,建構函式也有乙個(可能為空的)引數列表和乙個(可能為空的)函式體。類可以包含多個建構函式,和其他過載函式差不多,不同的建構函式之間必須在引數數量或引數型別上有所區別。

不同於其他成員函式,建構函式不能被宣告為const的。當我們建立乙個const物件時,直到建構函式完成初始化過程,物件才能真正取得其「常量」屬性。因此,建構函式在const物件的構造過程中可以向其寫值。

合成的預設建構函式

類通過乙個特殊的建構函式來控制預設初始化過程,這個函式叫做預設建構函式。預設建構函式無須任何實參。(明確一點,如果乙個建構函式不接受任何實參,則它是乙個預設建構函式)

如果我們的類沒有顯示的定義建構函式,那麼編譯器就會為我們隱式地定義乙個預設建構函式。編譯器建立的建構函式又被稱為合成的預設建構函式。對於大多數類來說,這個合成的預設建構函式將按照如下規則初始化類的資料成員:

·如果存在類內的初始值,用它來初始化成員。

·否則,預設初始化該成員。

(預設建構函式包括自定義的和合成的預設建構函式)

某些類不能依賴於合成預設建構函式

合成的預設建構函式只適用於非常簡單的類。對於乙個普通的類來說,必須定義它自己的預設建構函式。原因有三:

·只有當類沒有宣告任何建構函式時,編譯器才會自動地生成預設建構函式。也就是說如果我們定義了一些非預設建構函式,除非再定義乙個預設建構函式,否則該類沒有預設建構函式。

·對於某些類來說,合成的預設建構函式可能執行錯誤的操作。如果類包含有內建型別或者復合型別的成員,則只有當這些成員全都被賦予了類內初始值時,這個類才適合於使用合成的預設建構函式。否則,使用者在建立類的物件時就可能得到未定義的值。

·有時候編譯器不能為某些類合成預設的建構函式。例如,如果類中包含乙個其他類型別的成員且這個成員的型別沒有預設建構函式,那麼編譯器將無法初始化該成員。

=default的含義

在引數列表後寫上=default來要求編譯器生成建構函式。

其中,=default既可以和宣告一起出現在類內部,也可以作為定義出現在類的外部。和其他函式一樣,如果=default在類的內部,則預設建構函式是內聯的;如果它在類的外部,則該成員預設情況下不是內聯的。

我們定義這個建構函式的目的僅僅是因為我們既需要其他形式的建構函式,也需要預設的建構函式。我們希望這個函式的作用完全等同於之前使用的合成預設建構函式。

建構函式初始值列表

如果編譯器不支援類內初始值,那麼預設建構函式應該使用建構函式初始值列表來初始化類的每個成員。

sales_data(const std::string &s): bookno(s)

冒號及冒號和花括號之間的**是建構函式初始化列表,它負責為新建立的物件的乙個或幾個資料成員賦初值。建構函式初始值是成員名字的乙個列表,每個名字後面緊跟括號括起來的(或者在花括號內的)成員初始值。不同成員的初始值通過逗號分隔開來。

通常情況下,建構函式使用類內初始值不失為一種好的選擇。建構函式不應該輕易覆蓋掉類內的初始值,除非新賦的值與原值不同。(初始值列表忽略某個資料成員而且該資料成員也沒有類內初始值,那麼就會執行預設初始化,若是內建型別,就會在建立物件時得到未定義的值)

函式體為空的情況:因這些建構函式的唯一目的就是為資料成員賦初值,一旦沒有其他任務需要執行,函式體也就為空了。

當某個資料成員被建構函式初始值列表忽略時,它將以與合成預設建構函式相同的方法隱式初始化。也就是說,沒有出現在建構函式初始值列表中的成員將通過相應的類內初始值(如果存在的話)初始化,或者執行預設初始化。 

拷貝、賦值和析構

儘管編譯器能替我們合成拷貝、賦值和銷毀操作,但是必須要清楚的一點是,對於某些類來說合成的版本無法正常工作。在學習關於如何自定義操作之前,類中所有分配的資源都應該直接以類的資料成員的形式儲存。

抽象資料型別

本篇文章簡單的講解下表 棧 佇列。首先先了解一下什麼是抽象資料型別。它是這麼定義的 抽象資料型別 abstract data type,即adt 是帶有一組操作的一些物件的集合。那麼adt怎麼理解呢?首先你只需要記住表 集合 圖以及與他們各自的操作一起形成的物件都可以被看做抽象資料型別.這就跟整型 ...

抽象資料型別 表

資料結構與演算法分析.c 實現 總結 抽象資料型別 abstract data type,首先顧名思義,她是一種資料型別,就像整數 字元,類似於加減乘除,他有自己的操作,例如 並和查詢 並沒有什麼法則規定一定要有什麼操作,具體的看設計要求 每種資料型別的實現方式也是不同的,主要有 陣列實現和鍊錶實現...

抽象資料型別(ADT

說到抽象資料型別,那麼就得先提到資料型別 資料型別指的是乙個值的集合以及定義在這個集合上的一組操作 為什麼要有不同的資料型別呢 當我們計算1 1的時候,只需要很小的儲存空間,但是當我們去計算10000 100000的時候,所需要的空間就會大許多,那麼我們為了去區分這些類別的差異,就有了不同的資料型別...