C++ 類和對象-封裝(持續更新)

封裝的意義

  • 將一類事務的屬性和行爲封裝起來,表現生活的事務
  • 將屬性和行爲添加權限控制
  • 抽象一類事務,使其關係更加明顯,更容易被使用

基本語法: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)時調用

語法:類名() {}

  1. 構造函數沒有返回值
  2. 構造函數可以有參數也可以沒有參數
  3. 構造函數一定與類名相同
  4. 構造函數只在對象創建時調用一次

默認構造函數

當我們沒有提供任何一個自定義構造函數的時候,編譯器會默認生一個無參構造類名(){},如果我們有提供任意一個自定義構造函數時,編譯器就不會幫我們生成了

析構函數

解決清理對象時的問題,在對象被清理(delete)或退出作用域時調用

語法:~類名() {}

  1. 析構函數沒有返回值
  2. 析構函數不可以有參數
  3. 析構函數一定與類名相同,且前面有~符號
  4. 析構函數在對象被銷燬時被調用,且只會被調用一次

默認析構函數

當我們沒有提供任何一個自定義析構函數的時候,編譯器會默認生一個無參析構類名(){},如果我們有提供任意一個自定義析構函數時,編譯器就不會幫我們生成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章