1. 程式人生 > >初識C++: 類和物件(1)

初識C++: 類和物件(1)

類和物件的初步認識:

類是物件的抽象,物件是類的具體例項。因為類是抽象的,所以類不佔用記憶體,而物件是具體的,佔用儲存空間。

我們都知道,C語言時面向過程的語言,它關注的是過程中的資料與方法。

C++是面向物件的語言,它關注的是物件的屬性與功能

用一張圖來理解類和物件

我們知道了類其實就是一種抽象概念,那麼在C++中,怎麼引入類

我們已經知道在C語言中可以定義結構體,結構體中可以放各種型別的變數,也可以巢狀結構體。

那麼在C++中,我們的結構體不僅可以定義變數,也可以定義方法(也就是函式)。這樣的結構體,在C++中就被稱為類

struct Student
{
    char _name[20];
    char _gender[3];
    int _age;
    void SetStudentInfo(const char *name,const char *gender,int age)
    {
        strcpy(_name,name);
        strcpy(_gender,gender);
        _age = age;
    }
};

int main()
{
    Student s;
    s.SetStudentInfo("Peter","男",18);
    return 0;
}

像上面這樣的結構體,在C++中更喜歡用class來代替。

那麼類該怎麼定義。

class className
{
    //類體:由成員函式和成員變數組成
};  //和結構體類似,一定要有分號

class為定義類的關鍵字,className為類名,{}中為類的主體,注意最後的分號;

類中的元素稱為類的成員,類中的資料稱為類的屬性或者叫類的成員變數,類中的函式叫做類的方法或者類的成員函式

定義一個簡單的類:

class Person
{
public:
    //顯示基本資訊
    void showinfo();
public:
    char *_name;
    char *_sex;
    int _age;
};

類有兩種定義方式:

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

2.類的宣告放在 .h 檔案中,類的定義放在 .cpp檔案中(這就好像是C語言中的函式的宣告,我們通常把函式的宣告放在標頭檔案中,把函式的定義放到 .c檔案中)

類的訪問限定符及封裝

類有三種訪問限定符:public(公有)、protected(保護)、private(私有)

說明:

1.public成員可以在類外直接進行訪問

2.protected和private成員在類外不能夠訪問

3.它們的作用域從該訪問限定出現的位置到下一個訪問限定符出現為止

4.類中如果沒有訪問限定符,則預設為private

5.struct為public型(因為要相容C語言)

注意的是:訪問限定符只有在編譯的時候有用,一旦當資料對映到記憶體後,沒有任何訪問限定符上的區別。

我們知道,當我們把一些變數放到private下,那麼我們在類外就無法直接訪問這些變數,這就產生了一個封裝的概念:

封裝:隱藏物件的屬性和實現細節,僅對外公開介面和物件進行互動,將資料和操作符的方法進行有機結合。

類的作用域:

類定義了一個新的作用域,類的所有成員都必須處在類的作用域中。

在類外定義成員,需要用::作用域解析符指明成員屬於哪個類域

在類的作用域外,只能通過物件(或指標)藉助成員訪問操作符 和 -> 來訪問類成員

前面我們說過,類只是抽象的概念,它不佔儲存空間,只有例項化出物件,才有真正的儲存空間。舉個簡單的例子:

類就好比房子的設計圖紙,它只是構造出了房子的具體框架。物件則是依據設計圖紙修剪出的具體的房子,這樣的房子可以不止一個,

所以類可以例項化出很多的物件。

類只是一個模型一樣的東西,限定了有哪些成員,定義出了一個類但是並沒有分配實際的記憶體空間來儲存

一個類可以例項化出很多個物件,例項化出的物件,佔用實際的物理空間來儲存類成員變數

程式碼舉例:

class Person{
public:
    void showInfo()
    {
        cout<<_name<<"_"<<_sex<<"_"<<_age<<endl;
    }
public:
    char *_name;
    char *_sex;
    int _age;
};

void Test()
{
    Person man;
    man._name = "jack";
    man._sex = "男";
    man._age = 10;
    man.showInfo();
}

前面說過類和結構體很相似,那麼類的大小的演算法是不是也和結構體很相似呢?

其實,類的大小就是類中成員變數之和,當然,計算時,也要遵循記憶體對齊(這裡要說明的一點:空類的大小是1,因為這個類比較特殊,因此編譯器個了空類一個位元組來標識這個類)

來複習下記憶體對齊的規則:

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

2.其他成員要對齊到某個數字(對齊數) 的整數倍的地址處。(對齊數 = 編譯器預設的一個對齊數與該成員大小的較小值,VS環境下預設為8,gcc中預設為4)

3.結構體總大小為最大對齊數的整數倍

4.如果嵌套了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍。

類的this指標

每個成員函式都有一個指標形參,它的名字是固定的,叫作this指標,this指標是隱式的。

編譯器會對成員函式進行處理,在物件呼叫的的時候,物件地址作實參傳遞給成員函式的第一個形參this指標。

this指標是成員函式隱含指標形參,是編譯器自己處理的,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時,顯示傳遞物件的地址給this指標。