1. 程式人生 > >第十章 對象和類

第十章 對象和類

ble blog 使用 perm stat c++11 有一個 引入 組件

通常,C++程序員將接口(類定義)放在頭文件中,並將實現(類方法的代碼)放在源代碼文件中。

在oop中,通常把對象成員函數的調用稱作發送消息給對象。

訪問控制關鍵字:private(類默認的訪問控制)、public(結構體默認的訪問控制)、protected。

將實現細節放在一起,並將它們與抽象分開的思想稱為封裝

數據隱藏(將數據放在類的私有部分中)是一種封裝;

將實現細節隱藏在私有部分(私有成員函數),也是一種封裝;

將類聲明和類函數的定義放在不同文件中,亦是一種封裝。

類和結構的區別

1. 默認訪問類型不同。類是private,結構是public;

2. C++程序員實用類來實現類描述,而把結構限制為只表示純粹的數據對象。

實現類的成員函數要滿足兩個特殊特征:

1. 定義成員函數時,使用作用於解析運算符(::)來標識函數所屬的類;

2. 類方法可以訪問類的private組件。

位於類聲明中的私有成員函數將自動成為內聯函數,可以在類聲明之外定義(內聯)成員函數。

類的構造函數和析構函數

構造函數

初始化對象時自動調用構造函數:

//假設有一個Stock類
Stock A = Stock("apple", 250, 1.25);//對象A的初始化1
Stock A("apple", 250, 1.25);//對象A的初始化2

構造函數的函數名與類名相同。

類的構造函數沒有返回類型。

定義構造函數的參量名不應與類成員名相同。

默認構造函數

默認構造函數是,未提供顯式初始值時,用來創建對象的構造函數。(避免創建未初始化對象)

創建默認構造函數的方法:

1. 給已有構造函數的說有參量提供默認值;

2. 通過函數重載來定義另一個沒有參數的構造函數。

調用默認構造函數:

Stock A;//隱式地調用默認構造函數
Stock B();//顯式地調用默認構造函數

析構函數

對象過期時(作用域失效)時,將自動調用析構函數(每個類對象都必須有一個析構函數),一般用析構函數完成清理工作。

只需把函數名定義為“類名前加~”即可創建析構函數,而不需要任何參數。

如果程序員沒有創建析構函數,則程序將隱式地聲明一個默認析構函數。

C++11可將列表初始化應用於類。

Stock hot_hip = {"apple", 100, 45.0};
Stock jock {"SuperMan", 200, 2.3};

在類成員函數聲明定義的開頭後置const,可以確保調用對象不被類成員函數修改

//函數聲明
void show() const;
//函數定義
void show() const
{
  ...  
}

對象初始化的其它情形

Bozo *pc = new Bozo("popo", "Le Peu");//動態對象
Bozo tubby = 32;//單參數構造函數的情形

this指針指向用來調用成員函數的對象。

類作用域

C++的函數名稱的作用域可以是全局的但不能是局部的。C++類引入了一種新的作用域:類作用域(在類中定義的名稱的作用域為整個類)。

作用域為類的常量

不允許在類中聲明const常量,因為聲明只是描述對象的形式,而不能創建對象。

但有兩種方法可以聲明作用域為類的常量:

1. 在類中聲明一個枚舉(但並不創建枚舉量);

enum {Months = 12};

2. 在const限定符前使用關鍵字static(該常量與靜態變量存儲在一起,而不是存儲在對象中)。

在C++98中只能使用這種技術聲明值為整數或枚舉的靜態常量,而不能存儲double常量。(但C++11消除了這個限制)

C++11提供了一種新的枚舉——作用域內枚舉(其枚舉的作用域為類):

enum class egg {Small, Medium, Large};// or enum struct egg {Small, Medium, Large};

可以使用作用域解析運算符訪問枚舉成員。

枚舉類成員不能像常規枚舉一樣,隱式地轉換為某種底層整型類型(提高了作用域內枚舉的類型安全),但可以進行強制類型轉換。

int Frodo = int(egg::Small)

C++11允許選擇底層整型類型(默認為int):

enum class : short egg {Small, Medium, Large};//:short將底層整型類型指定為short

第十章 對象和類