封裝的意義
- 將一類事務的屬性和行爲封裝起來,表現生活的事務
- 將屬性和行爲添加權限控制
- 抽象一類事務,使其關係更加明顯,更容易被使用
基本語法:class ClassName {};
類的名稱應該單詞的首字母大寫
基本案例:
class Phone {
public:
string phoneNumber; // 電話的一個屬性,電話號碼
void callToAny(string& phoneNumber) {
// 這是一個行爲,表示這部手機可以打電話給誰
cout << "打電話給:" << phoneNumber << endl;
}
};
void main() {
Phone* phone = new Phone();
string callToPhone{ "10086" };
phone->callToAny(callToPhone);
delete phone; // 記得釋放內存
}
權限控制
類在設計時,可以把成員放在不同的權限下,加以控制,也可以把關係整理的更加清晰
訪問權限有三種:
權限關鍵字 | 權限簡述 |
---|---|
public | 公共權限,成員可以在類的內部以及外部被訪問 |
private | 私有權限,成員只能在類的內部被訪問 |
protected | 受保護權限,成員只能在類的內部以及子類的內部訪問 |
示例:
class Person {
public:
string name = null; // 人的名字是可以被公開的
private:
string fere; // 人的伴侶是私有的,只能自己擁有
protected:
string bandCard; // 銀行卡雖然不能給外人,但是可以留給繼承自己的孩子
};
void main() {
Person* person = new Person();
person->name = { "老李" }; // 正確的,可以被外界所知
person->fere = { "小麗" }; // 錯誤的,這個只能是自己的
person->bandCard = { "123456789" }; // 錯誤的,這個只能是自己的或者子類的
delete person;
}
對象的初始化和清理
當在創建(new
)對象時這個對象要相對的進行初始化,而在清理(delete
)時要相對的清理這個對象
簡單示例:
class Person {
public:
string *name;
Person(string* name) {
// 需要一個string類型字符串的內存地址
this->name = name;
}
~Person() {
// 釋放name字符串所指向的內存地址
delete name;
}
};
構造函數
解決創建對象時初始化問題,在對象被創建(new
)時調用
語法:類名() {}
- 構造函數沒有返回值
- 構造函數可以有參數也可以沒有參數
- 構造函數一定與類名相同
- 構造函數只在對象創建時調用一次
默認構造函數
當我們沒有提供任何一個自定義構造函數的時候,編譯器會默認生一個無參構造類名(){}
,如果我們有提供任意一個自定義構造函數時,編譯器就不會幫我們生成了
析構函數
解決清理對象時的問題,在對象被清理(delete
)或退出作用域時調用
語法:~類名() {}
- 析構函數沒有返回值
- 析構函數不可以有參數
- 析構函數一定與類名相同,且前面有~符號
- 析構函數在對象被銷燬時被調用,且只會被調用一次
默認析構函數
當我們沒有提供任何一個自定義析構函數的時候,編譯器會默認生一個無參析構類名(){}
,如果我們有提供任意一個自定義析構函數時,編譯器就不會幫我們生成了