當一個C++程序員在設計類型時,他在想什么?
- 這一類型的對象,需要擁有哪些屬性數據?
- 這一類型的對象,它將擁有哪些功能?
- 這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系?
(課堂視頻在第3點,建議先閱讀文字內容)
1. 為自定義類型添加成員
是時候來關心對象自身的屬性與功能了!在C++中,對象的屬性,通常稱為“成員數據”,對象的功能,通常稱為“成員函數”。
前兩節課中,我們還創造過“恐豬”和“恐蛇”物種啊,這兩種類型,按說就應該很厲害才是。但可惜,它們只是在類型的名字上,聽起來很厲害的樣子,其實,我們也只是為它們定制了生和死的功能。
假設我們要寫一個游戲程序,里面就有像“恐豬”和“恐蛇”這樣的怪獸。游戲的玩家可能需要殺死它們。那么,怪獸是不是要有像血氣值、攻擊力、防護力這樣的數據?同時,除了生和死,怪獸對外要有攻擊和被攻擊的能力。
攻擊的意思就是,玩家進入某一只怪獸的某個范圍時,怪獸可能會主動攻擊玩家,對玩家造成一定的傷害。被攻擊則相反,如果玩家給它一拳,也就是怪獸被攻擊了,這時怪獸是直接掛掉?還是說只是血氣值減少一丟丟說?或者說給它一拳以后,它反倒更加興奮了?
血氣值,攻擊力,防護值 ,它們就是一個類型或者一個對象的屬性,通常它們以一種特殊的數據形式出現,稱為成員數據。而:怪獸會攻擊人也會被攻擊,這些就是一個類型或一個對象的能力,通常以特殊的函數形式的出現,稱為成員函數,在更多對面向對象的語言,也稱為“方法”。
2. 理解方法和屬性之間的關系
結合怪獸這個案例,來看看,在定義一個組合類型時,我們需要表達什么?
1、這一類型的對象,需要擁有哪些屬性數據?
2、這一類型的對象,它將擁有哪些功能?
3、這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系?
其中理解第三點,非常重要:屬性和功能之間,通常存在緊密的關系。一個功能的實施,可能會引發一些屬性值的變化。比如,怪獸被攻擊,通常是不是它的血氣值 ,也就是游戲中常見的,頂在怪獸頭上的“生命條”,會變短;當然,也可以“防護值”這個屬性也考慮上,一只怪獸當前的“防護值”越大,比如說它正好穿著鎧甲,那么,它被攻擊時,血氣值一下子減少的數量,通常就慢一些。
再來看“攻擊力”這個屬性,和“攻擊”這個能力的關系——也很好理解 :這只怪獸當前攻擊力越強,那么對玩家造成的傷害就越大。
再來看真實一些的例子:賽車。成員數據可以有 油量、速度、方向等等,其成員方法則可以有跑(行駛)、轉向、踩油門(也就是加速),踩剎車(也就是減速等等)。大家肯定能夠想象得出,汽車的這些成員數據和成員函數之間的合理關系。
如果把汽車的例子進一步簡化到只有速度和油量兩個數據,以及踩油門和踩剎車兩個方法。那么這個賽車類型,用結構/struct的來表達的偽代碼,大概就長這樣子:
// 偽代碼
struct 賽車
{int 速度 = 0;int 油量 = 100;賽車 () {cout << “賽車啟動啦!油量100,速度為零,請踩油門!” << endl;};void 踩油門() { 加大速度, 消耗油量 };void 踩剎車() { 降低速度 };
};
基本關系就是,調用一個賽車對象踩油門的方法,車就會加大速度,同時消耗更多的油;而調用踩剎車方法,則會降低速度。
實際定義一個完善的汽車的類型,還是有很多邏輯關系要想清楚的。比如踩油門并不一定會提速,因為汽車可能沒油了。
?
3. 課堂視頻
ff13-HelloObject-成員版
4. 完整代碼
#include <iostream>// 定義人類結構
struct Person
{Person() { std::cout << "哇哇~" << std::endl; };~Person() { std::cout << "嗚嗚~" << std::endl; }// 自我介紹void Introduce() // 成員函數,方法{std::cout << "大家好,我叫 " << name << std::endl;}std::string name; // 成員數據,屬性
};int main()
{Person xiaoA;xiaoA.name = "小A";xiaoA.Introduce();std::cout << "------------------\n";auto* xiaoB = new Person;// 寫法一,取值后再訪問成員(*xiaoB).name = "小B";(*xiaoB).Introduce();delete xiaoB;std::cout << "------------------\n";// 寫法二:簡易寫法“箭頭訪問符”auto* xiaoC = new Person;xiaoC->name = "小C";xiaoC->Introduce();delete xiaoC;
}
運行效果:
哇哇~
大家好,我叫 小A
------------------
哇哇~
大家好,我叫 小B
嗚嗚~
------------------
哇哇~
大家好,我叫 小C
嗚嗚~
嗚嗚~