提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、面向對象的三大特征
- 二、類的引入
- 2.1類的定義
- 三.類的訪問限定符
- 3.1訪問限定符的介紹
- 3.2.訪問限定符的使用
- 四、類的作用域
- 五、類的實例化
- 六、類對象模型
- 6.1 如何計算類對象的大小
- 總結
前言
在學習C語言你可能聽到過,C語言是面向過程的語言,關注的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。
C++是基于面向對象的,關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成
一、面向對象的三大特征
c++面向對象的語言,同樣的具備面向對象的特性:分裝、繼承、多態。
特性一:封裝
將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來和對象進交互。(簡單來說,就好比我們在學習c語言時使用的一些函數如:printf函數,我們在使用它的時候并不知道它的底層是怎么實現的)
特性二:繼承
繼承是一個進程,通過一個進程,一個對象可以獲得另一個對象的屬性(數據和函數),且可以想起加入屬于自己的方法和屬性。用這種方法可以自動的對一個類中提供另一個類的成員和數據結構。當A類被另B類繼承,A類可以稱之為基類或者父類;B類被稱之為派生類或者子類。
特性三:多態
如果幾個相似而不完全相同的對象,當對他發出同一個消息時,他們的反映各不相同,執行不同的操作。這種現象叫做多態現象。在C++中多態是指由繼承而產生的相關的不同的類,其對象會對同一消息做出不同的相應。他能增加程序的靈活性。
二、類的引入
C語言中,結構體中只能定義變量,在C++中,結構體內不僅可以定義變量
,也可以定義函數 。
在學習C語言時,我們并沒有聽到類的概念,c++是以C語言為基礎,對其進行完善和拓展的,而c++是兼容C語言的,所以在c++中定義類的方式有兩種。
struct classname
{//成員變量//成員函數
};class classname
{//成員變量//成員函數
};
當然以上兩種方式存在差別,等一下我們會展開介紹。
2.1類的定義
代碼如下(示例):
也可以將關鍵字struct替換為關鍵字class(可以將class看作struct的升級版)
struct為定義類的關鍵字,stack為類的名字,{}中為類的主體,注意類定義結束時后面分號不能省略。
類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或者成員函數。
這里需要注意,如果類的成員函數聲明和定義都在類的內部,可能會被編譯器當作內斂函數來處理。
上面結構體的定義,在C++中更喜歡用class來代替
三.類的訪問限定符
3.1訪問限定符的介紹
成員訪問修飾符: 描述了類成員的訪問控制,即所能使用的一個范圍
公有的public:沒有訪問限制,其他類可以訪問公有成員變量和方法。
保護的protected:只能在當前類和繼承該類的子類中訪問,受保護成員變量和方法對于其他類不可見。
私有的private :只能在當前類中訪問,其他類無法直接訪問。
在上面我們提到,雖然c++支持使用關鍵字struct和class來創建類,但是這兩種方法還是會存在差異:
對于使用關鍵字class創建的類,其默認成員函數及成員變量是私有的(只允許該種類創建出來的對象訪問),若是想進行訪問,必須使用關鍵字public來修飾。
使用關鍵字struct創建的類,默認成員變量及成員函數是共有的,可以對它直接訪問,這里就不演示了。
3.2.訪問限定符的使用
訪問限定符的作用域,是從使用第一個訪問限定符開始,直到出現下一個訪問限定符為止,若是此后未再出現訪問限定符,則生效區域直到類的結束。
示例:
四、類的作用域
類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員時,需要使用::作用域操作符指明成員屬于哪個類域。
示例:(聲明定義分離)
class Person{public:void PrtPerson();private:char _name[20];char _gender[3];int _age;};
// 這里需要指定PrtPerson是屬于Person這個類域
void Person::PrtPersonInfo(){cout<<_name<<" "_gender<<" "<<_age<<endl;}
還有一種靜態變量值的缺省,也需要用到,這個以后在介紹,感興趣的可以搜搜。
五、類的實例化
用類類型創建對象的過程,稱為類的實例化
- 類只是一個模型一樣的東西,限定了類有哪些成員,定義出一個類并沒有分配實際的內存空間來存儲它
- 一個類可以實例化出多個對象,實例化出的對象 占用實際的物理空間,存儲類成員變量
- 做個比方。類實例化出對象就像現實中使用建筑設計圖建造出房子,類就像是設計圖,只設計出需要什么東西,但是并沒有實體的建筑存在,同樣類也只是一個設計,實例化出的對象才能實際存儲數據,占用物理空間
六、類對象模型
6.1 如何計算類對象的大小
class Stack
{
public:void Init(){int* pos;pos = nullptr;top = capacity = 0;}
private:int* a;int top;int capacity;
};
問題:類中既可以有成員變量,又可以有成員函數,那么一個類的對象中包含了什么?如何計算一個類的大小呢?
接下來我們就用上面的類展開討論
我們回想在C語言中,我們計算一個對象的大小時,會使用操作符sizeof,那么我們嘗試一下會得到什么結果:
可以看到計算的結果為16,只計算了類中的成員變量,成員函數所占的空間并沒有計算。看來設計還是挺合理的,如果每用這個類型創建的一個對象,都要給它配一套成員函數,那也太浪費了。為了避免浪費,我們的C++祖師爺只保存了類中成員變量,成員函數存放在公共的代碼段(所有使用這個類創建的對象,共有一塊函數代碼)
總結
在上面我們并沒有提及結構對其的原則,大家在進行類大小計算時,要將其考慮在內!!!!!