c primer第七章類小結 7

2021-07-24 08:26:00 字數 3225 閱讀 6393

第七章------類

c++中定義自己的資料型別叫做類。 資料抽象是依賴於具體實現與物件能執行的操作分離開來的一種技術 ,封裝實現介面和實現分,類的基本思想是資料抽象和封裝。 類的

介面包括使用者所能執行的操作;類的實現包括類的資料成員、負責介面實現的函式體以

及定義類所需的各種私有函式,15章說核心思想是資料抽象,多型,繼承。

1.定義抽象資料型別 

引入this:使得成員函式可以使用呼叫這個函式的物件的成員,this是乙個常量指標。他繫結的位址不能變。

引入const 成員函式:this是乙個指向類型別的非常量版本的常量指標type(或者class) * const;所以不能繫結到乙個常量物件上,

導致常量物件不能呼叫普通成員函式,這就需要this指向常量物件;對於普通函式而且this是乙個普通指標可以這樣宣告this:const 

sales_data *const;但是this是隱式的不會出現在引數列表;所以要選擇乙個位置來將this宣告為指向常量的指標,c++讓const跟在

函式引數列表後面來解決,這樣的成員函式稱為常量成員函式。

2.類作用域和成員函式: 

類本身是乙個作用域,類的成員函式巢狀定義在類作用域內,編譯器處理類時分兩步:先編譯成員宣告,然後才是成員函式,所以

成員函式可以隨意使用成員名,無須在意宣告順序,

在類的外部定義的成員函式: 

在外部定義的成員函式必須與她在類內的宣告匹

配,包括返回型別,引數列表函式名,如果被宣告稱常量成員函式引數列表後加

const,類外部定義的成員的名字必須包含所屬的類

名(使用作用域運算子)。

3.定義類相關的非成員函式 

這些函式屬於類介面的組成部分,但又不屬於類本身。定義它們的方式與普通函式一樣,生命和定義分開,宣告和類宣告放在同一

個頭檔案內; 預設情況下拷貝類物件拷貝的是物件的資料成員

4 .建構函式:初始化物件 

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

特點:名字和類名相同,沒有返回型別;其他與普通函式類似

建構函式初始值列表:她負責為建構函式新建的物件的乙個或幾個資料成員賦初值。建構函式初始值是成員名字的乙個列表每個名

字後面緊跟括號括起來的(或者在花括號內的)成員初始值;不同成員初始值用逗號隔開。 

函式體是空的,這是因為建構函式的唯

一目的就是為資料成員賦初值.

在類外部定義的建構函式:和其他成員函式一樣,外部定義的建構函式也必須指明建構函式是哪個類

的成員,她執行建構函式體而沒有初始值列表;

5.訪問控制與封裝

public:定義類的介面,在整個程式內可見

private:該說明符之後的成員可以被類的成員函式訪問但是不能被使用該類的**訪問

使用public和struct定義類的唯一區別是預設訪問許可權不同

6.友元:提供了對類的非公有成員的訪問

必須在類定義內部宣告友元 ,一般來說最好最好在類定義的開始或結束前集中宣告友元(雖然不受類作用域約束),友元的宣告僅僅指定了訪問許可權,而非普通意義上的函式宣告,如果我們希望類的使用者能夠呼叫某個友元函式,就必須在友元宣告之外再專門對函式進行一次宣告.

7.雜項

inline可以在類內部宣告或者外部定義中使用關鍵inline;無需在類宣告和定義的地方同時說明inline,最好只在類外部定義的地方宣告inline。

可變資料成員:類內部定義的函式是隱式的inline函式

mutable即使在const物件中也可以改變她宣告的成員。

類資料成員初始值 

類內初始值必須使用=的初始化形式或者花括號括起來的直接初始化形式

8.類的作用域

作用域和定義在在類外部的成員: 乙個類就是乙個作用域的事實很好的解釋了為什麼當我們在類的外部定義成員函式時必須同時提

供類名和函式名;類的外部成員名字被隱藏了,

宣告了類名之後,定義的剩餘部分就在類的作用域內了,包括引數列表和函式體,

9.名字查詢與類的作用域 

名字查詢:尋找與所用名字最匹配的宣告的過程,從所在快開始,只向前查詢,由內向外;

定義在類內部的成員函式,解析其中的

名字方式與上述查詢規則有所區別; 

型別名的定義通常出現在類的開始處,這樣就能確保所用使用該型別的成員都出現類名定義之

後,成員函式內使用的名字的 解析順序:函式內查詢,函式所在的類內查詢,類外查詢,如果類內有成員與函式用的名字同名,但是我們想要的是外部的這時可以使用全域性作用域運符: 

10.聚合類 

所有成員public,沒有建構函式,沒有類內初始值,沒有基類虛函式,他的初始化是使用花括號括起來的成員初始值列表,初始值的順序必須與宣告順序一致;

11.類的靜態成員 

讓某些成員與類相關而不是物件:通過在成員宣告前加上static使其與類關聯在一起,靜態成員可以是public也可以是private,靜態數

據成員可以是常量引用指標類型別等 ,

某個類的靜態資料物件為該類所有物件共享;類物件不包含任何和靜態成員有關的資料。

類似,靜態成員函式也不與任何物件繫結在一

起,他們不包括this指標,也就不能宣告成const,

使用類的靜態成員:使用作用域運算子直接訪問靜態成員。

靜態成員物件不屬於類

的某個物件,但是我們可以使用物件,引用,指標來訪問靜態成員,

函式定義內,成員函式不用使用作用域運算子就能訪問靜態成員。

定義靜態成員: 

和其他成員函式一樣,既可以在類的內部定義也可以在類的外部定義成員函式,在外部定義時,不能重複關鍵字static,該關鍵字

只能在類內部宣告語句出現;

靜態資料成員不屬於任何乙個物件,她們並不是在建立類的物件時被定義的,她們不是由建構函式初

始化的,

而且一般來說,不能

在類的內部初始化靜態資料,必須在外部定義和初始化每個靜態成員, 

靜態成員的類內初始化:要求靜態成員必須是字面值常量型別的constepr,初始值必須是常量表示式; 

靜態資料成員的型別可以是不完全型別,可以是他所屬的類型別,但是普通成員只能宣告所屬類的指標或者引用;另乙個區別是靜態成員可以作為預設實參,

靜態成員函式不能是虛函式,建構函式也不能是虛函式

c primer 第七章 類

const更大的作用是可以修飾函式的引數,返回值,定義體。1.用const 修飾函式的引數 如果引數作輸出用,不論它是什麼資料型別,也不論它採用 指標傳遞 還是 引用傳遞 都不能加const修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const修飾...

C Primer 第七章 類

成員函式 宣告在類內,定義可內可外,定義在類內則是隱式內聯函式 在成員函式內部,可以直接使用呼叫該函式的物件的成員 類外部定義的成員的名字必須包含所屬類名 this本身是乙個常量指標,預設情況下指向非常量版本 在引數列表後加const可以修改this指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...

C Primer 第七章 類

7.2 訪問控制與封裝 7.2.1 訪問說明符 7.2.2 友元 7.3 類的其他特性 7.4 類的作用域 7.5 建構函式高階 7.6 類的靜態成員 類的基本思想 封裝在成員函式內部,任何對類成員的直接訪問都被看做this的隱式掉用,也就是當我們使用成員變數bookno的時候,實際上隱式的使用了t...