1. 程式人生 > >類和物件(上)

類和物件(上)

一、類和物件

C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題

C++是基於物件的,關注的是物件,將一件事拆分成不同的物件,靠物件之間的互動完成

二、類的定義

注意:(1)C++相容C中所有的語法 

            (2) C中struct是結構體

            (3)C++struct和class都是類,但struct還可以認為是結構體

            (4)struct預設是public ,class預設是private

class  Name
{
    //類的成員函式和成員變數

};  //注意分號

類定義的兩種方式:

1.宣告和定義全部放在類中

2.宣告放在標頭檔案中,定義放在.cpp中 (常用)

三、類的訪問限定符及其特性

1.面向物件的三大特性:封裝、繼承、多型

2.訪問限定符:public、private、protected

說明:(1)public修飾的成員在類外可以直接被訪問

           (2)protected和private修飾的成員在類外不能直接被訪問

           (3)class預設的訪問許可權是private,struct為public(因為struct要相容C)

3.類的作用域

        類定義了一個新的作用域,類的所有成員都在類的作用域中。在類外定義成員,需要使用::作用域解析符指明成員屬於哪個類域。

注意:(1)儘量避免成員函式的引數與成員變數同名

           (2)成員變數前加 ‘_’ 下劃線

           (3)成員變數在類中具有全域性作用域屬性

四.類的例項化

   用類型別建立物件的過程,稱為類的例項化

1.類只是一個模型一樣的東西,跟圖紙一樣,定義出一個類並沒有分配實際的記憶體空間來儲存它

2.一個類可以例項化多個物件,例項化出的物件,佔用實際的物理空間

3.成員變數是獨立的,成員函式是共享的

class Person
{
    public:
         void Print()    //共享的  ,這些是定義
         {
             cout << _name << _sex << _age <<endl;   
         }


    private:
          char* _name;       // 獨立的 , 這些是宣告
          char* _sex;
          int age;
}

五、如何計算類的大小

結論:一個類的大小,實際上就是該類中 “成員變數” 之和,當然也要進行記憶體對齊

          空類比較特殊,編譯器給了空類一個位元組來唯一標識這個類

結構體記憶體對齊規則:

(1)第一個成員在與結構體偏移量為0的地址處

(2)其他成員變數要對齊到某個數字(對齊數)的整倍數處

        對齊數=編譯器預設的一個對齊數與該成員大小的較小值    VS預設為8,gcc預設為4

(3)結構體的總大小為:最大對齊數(所有變數型別最大者與預設對齊引數的較小值)的整數倍

(4)如果嵌套了結構體,巢狀的結構體對齊到自己最大對齊數的的整數倍處

六、this指標(重要)

1.C++編譯器給每個成員函式增加了一個隱藏的指標引數,讓該指標指向當前物件(呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標。該指標不需要使用者來傳遞,編譯器自動完成。

2.this指標的特性

(1)this指標的型別:類型別*  const

(2)只能在“成員函式” 的內部使用

(3)總是指向當前物件,不屬於物件的一部分,不影響sizeof結果

(4)this指標是成員函式第一個隱含的指標形參,一般由編譯器通過ecx暫存器自動傳遞

注意:this指標是形參,存在棧中(VS優化後存在ecx暫存器中)