C++中的類和物件的特性
C++的靈魂就在於他的“類和物件”,在經過一段時間的學習,我簡單總結一下我對於C++中的類和物件的一些總結。
一、對於類和物件的概述
1、類和物件是什麼?
什麼是‘類’和‘物件’?C++中的物件的型別稱為類(class),類是物件的抽象,物件式類的具體例項。下面以一段程式碼為例。
1 class Time 2 { 3 int hour; 4 int minter;
int sec; 5 };
6
7 Time time1,time2;
上面便是一個簡單的類,其中“類名”為Time,它的物件有兩個“time1”以及“time2”。這樣和C語言中的結構體十分相似,“類與物件”的關係也和“結構體型別與結構體變數”是一樣的。
總結下來類和物件的關係就是——類是物件的模板,是定義物件的一種抽象型別
2、類和物件的作用
“類”是C++對於C語言最為重要的改進,是實現面向物件程式設計的基礎。使用“類”將與此類相關的物件放在一起,形成一個整體,與外界分隔。這樣有三個好處:
一、便於合作,避免出現由於多人合作而產生的定義上的問題,可以避免誤呼叫;
二、這樣模組化的設計,可以降低程式設計難度,使得思路清晰,到時候組裝起來即可;
三、類的可繼承性,這樣是可以減少許多工作量。關於類的繼承性我們這裡暫且不提。
二、類和物件的定義及使用
1、類的公有和私有
C語言是面向過程的程式設計,這樣就出現了一個問題,那就是“資料缺乏保護”。面向過程設計中的資料是公用的、共享的,可以被不同的函式所呼叫,故而這些資料是缺乏保護的,而資料的交叉使用極為容易導致錯誤的產生。而C++中“類”,則是具有劃分公有部分和私有部分的功能,函式的呼叫只能呼叫公有部分,而私有部分“只供類內部使用”。C++私有部分宣告函式為“private”,公有部分宣告為“public”。
1 class Time 2 { 3 private: 4 int hour; 5 int minter; 6 int sec; 7 public: 8 void display() 9 { 10 cout << hour << ":" << minter << ":" << sec << endl; 11 } 12 };
以上述程式碼為例,其中的hour、minter、sec這三個為私有部分,只能在類的內部呼叫,在類外無法引用;而函式display則是公有部分,可以在類外引用。
2、類與結構體的異同
再次說明一下,C++是C語言的超集,C語言中功能在C++中基本是可以使用的,結構體在C++中不但可以使用,並且C++還將其的功能給予了擴充套件,甚至於在C++中允許使用struct來宣告一個類。也就是說,將class改為struct後,類其實仍然可以使用。
而struct建立的類,與class建立的類,二者的區別在於——在沒有設立private(私有部分)以及public(公有部分)時,struct所建立的類系統會將其成員預設為public;而class所建立的類,系統會將其成員預設為private。
3、物件成員的引用
所謂的物件成員,便是物件所屬類中的成員。其訪問方式有三種:1、通過物件名和成員運算子訪問;2、通過指標訪問;3、通過物件的引用進行訪問。
(一)通過物件名和成員運算子訪問
這種訪問方式的一般情況為“物件名.成員名”,
class Time { public: int hour; int minter; int sec; void display() { cout << hour << ":" << minter << ":" << sec << endl; } }; int main() { Time time1; time1.hour = 11; //這裡便是成員函式的引用,模式為“物件名.成員名” }
(二)通過指標訪問
class Time { public: int hour; int minter; }; Time t, *p; //定義物件t和指標變數p p = &t; //使p指向物件t cout << p->hour; //輸出p指向的物件中的成員hour
(三)通過物件的引用進行訪問
定義一個物件的引用來對此物件進行訪問,這個方法說的簡單點就是給這個物件取一個新名字,本質不變,物件與物件的引用會佔用同一個儲存單元。
例如:
Time t1; //定義Time類物件t1; Time &t2 = t1; //定義Time類引用t2,並使之初始化,初始化的值與t1相同; cout << t2.hour; //輸出物件t1中的成員hour
而此時的t2.hour其實也就是t1.hour
三、類和物件中的成員函式
上面簡單的說過了物件的成員,而物件的成員函式其實也就是在類中的函式。其用法與C語言中的外部呼叫基本上是一樣的。而成員函式非常重要的一點就是他是可以直接呼叫類中的函式的私有部分以及公有部分。
類的成員函式,一般有兩種引用方法:1、內建成員函式;2、類外定義成員函式;
但是實際上二者並沒有什麼不同。
class Time { private: int hour; int minter; int sec; public: void display() { cout << hour << ":" << minter << ":" << sec << endl; } };
這便是內建成員函式,函式display()在Time類的內部。
class Time { private: int hour; int minter; int sec; public: void display(); }; void Time::display() { cout << hour << ":" << minter << ":" << sec << endl; }
這便是類外定義成員函式,用了Time::display則是說明這個display是Time類中的函式;如果沒有"Time::",則說明引用的display()是一個全域性變數display()而非Time類中的display().