C Prime Plus 第10章 物件和類

2021-10-01 16:56:04 字數 3396 閱讀 4114

抽象

封裝(將實現細節放在一起並將它們與抽象分開被稱為封裝,種類:1)資料隱藏 ;2)將類函式定義和類宣告放在不同檔案中)和資料隱藏(將資料封裝到私有部分從而保護資料的完整性稱為資料隱藏)

多型繼承

**的可重用性

2.1 類的組成

類宣告:資料成員描述資料部分+成員函式(方法)描述公有介面,一般放於標頭檔案,類名首字母一般大寫;

類方法定義:如何實現類成員函式,一般放於原始檔;

2.2 成員的訪問控制

資料成員一般放在私有部分,成員函式一般放在公有部分;預設訪問控制為private;

類和結構的區別:1)結構的預設訪問控制是public,類是private;2)結構限制為只表示純粹的資料物件;

2.3 成員函式

成員函式的定義:

1)定義成員函式時,使用作用域解析運算子::來表示函式所屬的類,也就是類作用域;

2)成員函式可以訪問類的private部分;

內聯函式:定義位於類宣告中的函式自動成為內聯函式;但每個使用內聯函式的檔案都需要對其進行定義。

建立相應的物件時,每個物件都有自己的儲存空間,用於儲存內部變數和類成員;但同乙個類的所有物件共享同一組成員函式,即每個成員函式只有乙個副本,所有物件執行同乙個**塊,只是這些**塊用於不同的資料。

3.1 建構函式

作用:是一種特殊的類成員函式,在建立類物件時被自動呼叫,將值賦給資料成員。

宣告和定義建構函式:1)無返回型別; 2)通過函式過載,可以建立多個同名但特徵標不同的建構函式;3)其引數不能是資料成員,而是給資料成員賦值的變數,因此名稱不能與資料成員一樣。

使用建構函式

1)顯示呼叫:stock food = stock("abc",20,10.0);

2)隱式呼叫:stock food ("abc" ,20,10.0);

3)建構函式只能用來建立物件,而不能通過物件來呼叫建構函式。

預設建構函式

1)預設建構函式沒有引數,宣告中不包括值;

2)如果定義了其他建構函式,程式設計師必須為類提供預設建構函式;

3)定義預設建構函式的2種方法:一是給已有的建構函式的所有引數提供預設值;二是通過函式過載來定義乙個沒有引數的建構函式;一般情況下最好採用一方法;

3.2 析構函式作用

1)用來釋放物件使用的資源,並銷毀物件的非靜態資料成員;

2)無論何時乙個物件被銷毀時,都會自動呼叫其析構函式。

原型格式:~類名(); 析構函式沒有引數,且每個類只有乙個析構函式。

呼叫析構函式:

1)靜態儲存類物件:析構函式在程式結束時自動呼叫;

2)自動儲存類物件:析構函式在程式執行完**塊時自動呼叫;

3)new建立的物件:使用delete釋放記憶體時析構函式自動呼叫;

4)沒有提供析構函式時:編譯器自動呼叫乙個預設析構函式。

1)初始化:stock stock2 = stock("abcd",2,2.0);

2)賦值:stock1 = stock("acd",10,50.0);

第一條語句是初始化,在建立指定值的物件時,可能會建立臨時物件,也可能不會;

第二條語句是賦值,在賦值語句中使用建構函式總會在賦值之前建立乙個臨時物件。

二者相比,初始化效率更高。

const成員函式:當成員函式(類方法)不修改呼叫物件時,就應該將其宣告為const成員函式,這樣可以保證不會修改呼叫物件。

目的:當類成員函式需要設計兩個物件時,就需要this指標。

const stock & stock::

topval

(const stock &s)

const

top = stock1.

topval

(stock2)

;//this指標指向stock1,因為是stock1呼叫的topval()方法

1)this指標不占用大小,它不是物件的一部分,因此sizeof(this)是沒有值的;

2)this指標只在類成員函式中使用;

3)this指標只能用於非靜態成員函式;

4)每個成員函式都有乙個this指標;

5)呼叫:

一呼叫整個物件:*this

二呼叫成員變數:this->變數名

三呼叫成員函式:this->成員函式名()

宣告:與標準型別陣列一樣,例如:stock mystuff [4];

初始化物件陣列:

1)使用預設建構函式建立陣列元素:stock mystuff [4];

2)花括號中的建構函式建立臨時物件,

3)將臨時物件的內容複製到對應的元素中。

例如:

stock mystuff[4]

=

因此,要建立物件陣列,那這個類必須有預設建構函式。

類成員名的作用域是整個類,只在該類中已知,在類外未知,因此使用類成員名時,必須根據上下文使用直接成員運算子(.)、間接成員運算子(->)或作用域解析運算子(::)。

作用域為類的常量

使用符號常量的作用域為類:

class

b

上面是錯誤的,因為類只有在建立物件時才分配記憶體,那麼上面的語句是不能分配記憶體給costs的。

1)列舉常量:此方法不會建立類的資料成員,所有物件中都不包含列舉;由於建立的是列舉常量,而不是變數,因此可以不用列舉名。

classb;

double costs[months]

;}

2)靜態變數static:該常量與其他靜態常量存放在專門的一塊記憶體中,而不是儲存在物件中。

class

b

作用域內的列舉

1) 如果類中有兩個列舉,其中定義的列舉量可能會發生衝突,c++11提供了一種新的列舉:

enum

class

egg;

enum

class

fruit

;

並用列舉名來限定列舉量:

egg a = egg::l;

fruit b = fruit::l;

2) 轉化為整型

–隱式轉換:常規列舉可以自動轉換為int型,但類作用域中的列舉不能隱式轉換為int型;

–顯式轉換:int(egg::s);

第10章 函式

定義函式的格式 name command list 呼叫函式的格式 name 省略括號 檢視到所宣告的函式定義 declare f name 取消定義的函式,可以使用unset命令 unset name 案例 bin bash 定義函式printmsg用來輸出資訊到終端螢幕,該函式至少需要兩個引數 ...

第10章第8題

mylist.h ifndef mylist h define mylist h include const int len 10 class mylist endif void show double mid 這個函式用於簡單的顯示乙個double mylist.cxx include mylis...

第10章 預處理

10.1 預處理指令 指令 含義例項 define 定義巨集 define debug undef 取消巨集的定義 undef debug if判斷 if defined debug else cout debug elif else endif cout release error 輸出錯誤資訊 ...