C++中的類和對象(一:初識類和對象)

面向過程和麪向對象的初步認識

C語言是基於面向過程的,關注的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。

C++是基於面向對象的,關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成。
在這裏插入圖片描述

類的定義

class爲定義類的關鍵字,Person爲類的名字,{}中爲類的主體,注意類定義結束時後面的分號。

類中的元素稱爲類的成員:類中的數據稱爲類的屬性或者成員變量; 類中的函數稱爲類的方法或者成員函數。

成員函數的聲明和定義可以全部放在類體中,也可以將聲明放在 .h 文件中,定義放在.cpp文件中。

  • 舉個栗子
class Person{
public:
	// 成員函數
	void PrintPerson();
private:
	// 成員變量
	char _name[20];
	char _gender[3];
	int _age;
	……
};
// 這裏需要指定PrintPersonInfo是屬於Person這個類域
void Person::PrintPersonInfo(){
	cout<<_name<<" "_gender<<" "<<_age<<endl;
}

類的訪問限定符及封裝

  • 訪問限定符

public: 修飾的成員可以在類外被訪問(公有的)

private: 修飾的成員在類外不能直接被訪問(私有的)

class的默認訪問權限爲private | struct的默認訪問權限爲public(兼容C)

注:訪問限定符只在編譯時有用,當數據映射到內存後,沒有任何訪問限定符上的區別

【面試題】: C++中的struct和class的區別是什麼?

解答:C++是兼容C語言的,C++中的struct可以當成結構體使用。另外C++中struct還可以用來定義類,struct定義類和class定義類相似,區別是struct的成員默認訪問權限爲public,class的成員默認訪問權限爲private。

  • 封裝

封裝從字面上來理解就是包裝的意思,專業點就是信息的隱藏。

封裝: 封裝本質上是一種管理,用類將數據和操作數據的方法結合起來,通過訪問限定符隱藏對象的屬性和實現細節,僅公開接口與外部交互。

也就是說用戶是無需知道對象內部的細節,但可以通過該對象對外的提供的接口來訪問該對象。

封裝的優點: 提高了數據的安全性(外部不能隨意訪問私有的成員屬性)、提高了代碼的可維護性(只需要修改類就可以)、降低了代碼的耦合度(使代碼模塊化)。

類的實例化

類的實例化:用類創建對象的過程

  1. 類只是一個模型,限定了類有哪些成員,定義出一個類並沒有分配實際的內存空間來存儲它。
  2. 一個類可以實例化出多個對象,對象佔用實際的物理空間,存儲類的成員變量。

類相當於設計圖紙(設計出來什麼東西,但實際不佔空間)對象相當於使用圖紙建造出來的房子。

  • 舉個栗子
class AddClass{
private:
	int _num1;
	int _num2;
public:
	//默認內聯但爲了可讀性我們還是加上內聯的標誌
	inline void GetNum1(int num1){
		_num1 = num1;
	}
	inline void GetNum2(int num2){
		_num2 = num2;
	}
	//在類內聲明
	int AddNum();
};
//在類外定義
int AddClass::AddNum(){
	return _num1 + _num2;
}

int main(){
	AddClass add;//類的實例化
	add.GetNum1(1);//成員調用
	add.GetNum2(2);
	cout << add.AddNum() << endl;
}

如何計算類對象的大小

類中既有成員變量,又有成員函數,那麼一個類的對象中保存了什麼?如何計算一個類的大小?

要計算類對象的大小,首先我們得搞清楚類對象中包含了什麼。

  • 對象中只保存成員變量,成員函數放在公共代碼段

每個對象中成員變量是不同的,但都是調用同一份成員函數,當一個類創建多個對象時,每個對象如果都保存一份代碼,相當於相同代碼保存多次,會造成空間的浪費,所以對象中只保存成員變量,成員函數放在公共代碼段。

幫助理解: 類實例化出很多個人(對象),這些人都有不同的年齡或者姓名(成員變量),但是顯示它們姓名和年齡的函數(成員函數)都是一樣的。

  • 類對象的大小計算遵循結構體內存對齊規則

1.第一個成員在與結構體變量偏移位爲0的地址處
2.其他成員變量要對齊到對齊數整數倍的地址處

對齊數 = 編譯器默認的對齊數(VS爲8、Linux爲4) 與 該成員大小的較小值

3.結構體的總大小爲最大對齊數的整數倍
4.嵌套的結構體對齊到自己最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍。
在這裏插入圖片描述

this指針

我們類中的函數都存在公共代碼段,那麼編譯器使怎麼區分是哪個對象調用了成員函數呢?

這就牽扯到了每個類中隱藏的成員this指針

  • 什麼是this指針

this指針是一個指向類自身的指針

this指針會默認作爲成員函數調用的第一個參數,將調用成員函數的對象地址傳入this,在函數內部找到對象中的成員

實際上我們調用的代碼是這樣傳參的:

class AddClass{
private:
  int _num1;
  int _num2;
public:
  //默認內聯但爲了可讀性我們還是加上內聯的標誌
  inline void GetNum1(int num1)
  inline void GetNum1(AddClass* this, int num1){
    _num1 = num1;
  }
  inline void GetNum2(int num2){
    _num2 = num2;
  }
  //在類內聲明
  int AddNum();
  int AddNum(AddClass* this);
};
//在類外定義
int AddClass::AddNum(){
  return _num1 + _num2;
}
int main(){
  AddClass add;
  add.GetNum1(1);
  add.GetNum1(&add, 1);
  add.GetNum2(2);
  cout << add.AddNum() << endl;
  AddNum(&add);
}
  • this指針的特性

1.this指針不存儲在類中,每個編譯器對this指針存儲的地方都有所不同,在vs中this指針存儲在寄存器中
2.this指針可以爲空,但是一旦調用,需要訪問對象中成員變量就會由於this爲空發生內存越界(在對象開闢的空間上去找成員變量)而導致崩潰

小結

類和對象是讓C++ 得以實現面向對象,得以更加方便的進行大型項目編程的最重要的部分

技術就如同武術,基本功很重要,只要基本功紮實了,再去學習更深層次的東西就會比較容易,只要明白其原理,舉一反三就能達到“無招勝有招”的最高境界

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