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++核心——類中的權限》。
總結
從最終類的定義形式可以看出,其實類就是把屬性和行爲集合到一起從而實現封裝的概念。通過封裝還可以進一步實現權限操作,從而保證數據的安全性。簡單來說使用了類的概念就是使用了封裝的概念,類是封裝的一種實現形式。