• 文章
  • Xistenial 的 TUTS 類和物件課程
釋出
2013 年 8 月 18 日 (最後更新:2013 年 8 月 19 日)

Xistenial 的 TUTS 類和物件課程 第一課

評分:3.6/5 (15 票)
*****

類和物件


想象一個廚房……在這個廚房裡,你會擁有各種電器(爐子、冰箱、微波爐、水壺等)。這些電器構成了廚房,沒有它們,它就只是另一個房間。C++ 的工作方式基本上是相同的。廚房就是你的類,而所有其他電器都是類的成員。

定義類的通用語法是:

1
2
3
4
class classIdentifier
{
classMembersList
};


**缺少分號會導致語法錯誤!

類的成員分為三類:私有 (private)公有 (public)保護 (protected),這三者的統稱是成員訪問限定符

關於類的私有公有成員的一些事實
(*)-- 預設情況下,所有成員都被宣告為私有。
(*)-- 如果一個成員是私有的,你無法在類外部訪問它(示例 1 將對此進行說明)
(*)-- 一個公有的成員可以在類外部訪問(示例 1 將對此進行說明)

如何選擇公有和私有?


假設我們想定義一個類來實現程式中的一天時間。我們稱這個類為 clockType。此外,我們使用 3 個變數如下:

1
2
3
int hr;
int min;
int sec;


我們還希望執行以下功能:
1. 設定時間
2. 獲取時間
3. 列印時間 //嗯,我們需要讀取它,對吧?
4. 時間增加 1 秒
5. 時間增加 1 分鐘
6. 時間增加 1 小時
7. 比較兩個時間是否相等

從上面可以看出,clockType 類有 10 個成員變數。

好了,你已經走到這一步了,然後呢?這如何幫助解決公有和私有的困境?決定將哪些成員設為公有或私有取決於成員的性質。經驗法則是:
*如果一個成員需要在類外部訪問,將其宣告為公有。
*任何不應被使用者直接訪問的成員都應宣告為私有。
例如,使用者應該能夠設定時間和列印時間,所以它們應該是公有的。另外,增加時間和比較時間的功能也應該宣告為公有。為了防止直接操作成員變數 hour、minute、second,我們將它們設為私有。
**請記住,如果使用者可以直接訪問這些成員,我們還需要 setTime 函式做什麼?

你的程式碼現在看起來應該像這樣:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class clockType
{
public:
void setTime(int,int,int);
void getTime(int&,int&,int&) const;
void printTime() const;
void IncrementSeconds();
void IncrementMinutes();
void IncrementHours();
bool equalTime(const clockType&) const;

private:
int hr;
int min;
int sec;
};
 


(*)-- const 關鍵字指定這些函式不能修改 clockType 類的變數的成員變數。


物件宣告


到目前為止,我們一直在使用“類變數”這個詞,在技術 C++ 術語中,它被稱為物件

宣告類物件的語法是:

clockType myClock; // 宣告一個物件,myClock

訪問類成員


物件訪問類成員的語法是:

類物件名.成員名 // . (點) 被稱為點運算子

好了,我知道這些術語都挺枯燥的,你想看程式碼而不是讀一篇論文(所以你選擇了 C++ 而不是拉丁語),但跟上這些術語很重要,因為很多人在這裡會卡住。好了,說夠了,讓我們展示一些程式碼。


示例 1 (程式碼片段)


以下程式碼片段將向您展示訪問是如何工作的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Declaring our objects
clockType myClock; 
clockType yourClock; 

//Accessing

myClock.setTime(5,2,30)// values 5,2,30 passed as parameters to function setTime
myClock.printTime();
yourClock.setTime(x,y,z); //x,y,z are variables of type int.

if(myClock.equalTime(yourClock))
.
.
//Some code in here
.
.

//Illegal Statements
myClock.hr =10;
myClock.min = yourClock.min; 
/*Illegal because hr and min are private variables and cannot be accessed by the objects*/
 


本教程到此結束,讓所有這些內容消化一下。接下來我們將著手實現成員函式,並提供 clock 原始碼的完整示例,並解釋我所做的每一步。
</.X.>