C++核心——類的封裝

C++核心——類的封裝

封裝是一種思想,簡單的理解,就像是一個黑盒子,內部有一堆東西,外部留了一些說明(一般稱爲接口)供使用,不必在意內部是什麼東西,只要知道是幹嘛的就好,這也符合生活的事務的規律,例如電腦,它預留出了鍵盤、屏幕等交互設備,你知道怎麼用這些東西就好,不必知道內部怎麼實現的,而且封裝的好處還有一個就是,我想讓你知道的你就能知道,我不想讓你知道的你就沒法知道,比如,當你足夠牛的時候,Linux系統是開源的,你可以通過讀源碼瞭解到內部是如何實現這些功能,二Windows是商業的,他不給你提供源碼,你就沒法知道內如何運作的。其實在學習類之前也是有封裝的,比如函數就是對語句的一種封裝,從而實現代碼的複用。說了這麼多,還是切入主體吧,在瞭解封裝之前,需要先了解這個概念。

類和對象的概念

類是一類事物的抽象的集合,是一種抽象的概念,而對象就這個抽象概念下一個實實在在的,具體化的東西。一個簡單的例子就是人和張三,人是一個統稱,沒有具體的實實在在的東西,是一個抽象的概念,所以人是一個類,而張三在不考慮重名的前提下,他就是代表實實在在的某一個人,所以張三是一個對象,還有一個前提就是張三是人的一個對象不是別的東西的對象。還有一點需要注意的是,對象和類都是相對而言的,意思就是說對象是對類的一個具體化,只要對某一個類實現了具體化或者叫實例化,那麼它就是一個對象。比如,如果再換一個概念,我在人的基礎上再抽象處已個東西叫生物,那麼生物就是人的類,而人就是生物這一個概念的對象,但是人確實張三的抽象概念,所以人還是張三的類。

類的定義,如何實例化一個對象

先以上面的例子直接上演示代碼

class CPerson
{
	string name;
	string sex;
	int age;
};
CPerson p0;

通過關鍵字class創建一個Person類,通過類名接對象名來實例化對象。人都有姓名、性別、年齡,這些都是人的屬性。看到這裏是不是和某個東西很類似,沒錯和結構體幾乎一模一樣。

類與結構體的區別

typedef struct SPerson
{
    string name;
    string sex;
    int age;
}SPerson;
SPerson p1;

從表面看是一模一樣,就是將不同的數據類型重新組合成一種新的類型,其實這麼理解也沒有錯,類其實就是一種組合類型。既然如此,還弄這麼一個複雜的概念幹嘛呢,別急,接下來看看兩者的使用有什麼區別。

#include <iostream>
#include <string>
using namespace std;

typedef struct SPerson               # 構建一個SPerson的結構體
{
    string name;
    string sex;
    int age;
}SPerson;


class CPerson					    # 構建一個CPerson的類
{
    string name;
    string sex;
    int age;
};

int main()
{
    SPerson p0;						# 創建一個Sperson數據p0
    p0.name = "zhangsan";
    p0.sex = "boy";
    p0.age = 10;

    cout << p0.name << p0.sex << p0.age << endl;

    CPerson p1;						# 實例化Cperson的對象p1
    p1.name = "zhangsan";
    p1.sex = "boy";
    p1.age = 10;
    cout << p1.name << p1.sex << p1.age << endl;
    return 0;
}

*******************************運行結果**********************************
PS D:\study\language_C> g++ .\03_類與封裝.cpp
.\03_類與封裝.cpp: In function 'int main()':
.\03_類與封裝.cpp:15:12: error: 'std::__cxx11::string Person::name' is private
     string name;
            ^
.\03_類與封裝.cpp:23:8: error: within this context
     p1.name = "zhangsan";
        ^
.\03_類與封裝.cpp:16:12: error: 'std::__cxx11::string Person::sex' is private
     string sex;
            ^
.\03_類與封裝.cpp:24:8: error: within this context
     p1.sex = "boy";
        ^
.\03_類與封裝.cpp:17:9: error: 'int Person::age' is private
     int age;
         ^
.\03_類與封裝.cpp:25:8: error: within this context
     p1.age = 10;
        ^
PS D:\study\language_C>

整個編譯就報錯,很明顯現結構體部分是沒有問題的,那麼肯定是類出了問題,從運行結果來看就是給p1的屬性賦值出了問題,結果提示“is private”,沒錯這就是兩者的區別,類中的屬性默認是私有的,不可以直接被外面訪問,而結構體默認是公有的,可以隨便訪問和修改,這也符合現實規律,比如一個人張三,他的姓名、性別和年齡是不可能隨便給別人修改的呀。這就是結構體和類最大的區別: 默認的訪問權限不同,struct 默認權限爲公共,class 默認權限爲私有。至於什麼是權限,這個後面會繼續介紹。

現實中人出了有屬性外,還有行爲,比如說話,走路,喫飯等,所以類中還有行爲,在程序裏面用函數表示行爲,所以類中還有函數,這也是類與結構體的另外一個區別,當然結構體重也可以存放函數指針來實現這個功能,不過可能我才疏學淺,還沒這麼用過。綜合以上兩點,其實一個真正的類是包含屬性和行爲的集合,一版的形式如下:

class CPerson
{
private:
	string name;
	string sex;
	int age;
public:
	void speck()
	{
		cout << "speak" << endl;
	}
};
CPerson p0;

權限

上面提到了權限,這裏簡單做個介紹

公共權限 public 類內可以訪問 類外可以訪問 可以被繼承
保護權限 protected 類內可以訪問 類外不可以訪問 可以被繼承
私有權限 private 類內可以訪問 類外不可以訪問 不可以被繼承

上面提到的繼承,這個是另一個特性,詳情參考《C++核心——類中的權限》

總結

從最終類的定義形式可以看出,其實類就是把屬性和行爲集合到一起從而實現封裝的概念。通過封裝還可以進一步實現權限操作,從而保證數據的安全性。簡單來說使用了類的概念就是使用了封裝的概念,類是封裝的一種實現形式。

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