1. 程式人生 > >C++學習筆記(二):類和物件

C++學習筆記(二):類和物件

類是物件共性的抽象,一種自定義的資料型別,可認為是C語言中結構體的拓展。它的作用是將資料和演算法(資料操作)封裝在使用者自定義的抽象資料型別中。

為什麼要在C++中新增類這樣一種“工具“呢? 程式中的每一組資料都是為某一種操作而準備的。而資料的交叉使用容易導致資料被誤操作,影響程式的正常執行。因此大牛們想到了把相應的資料和操作封裝在一起,構成物件。

類包含資料和演算法,並且他們都可以有兩種屬性:public和private。(注意類的宣告是一個語句,所以不要忘記在最後的花括號後加分號。)

一般來說為了保證資料資訊的隱蔽,資料都定義為private,不可被除成員函式之外的程式呼叫。而定義為public的成員函式作為類提供的功能的實現,成為了對外的介面,外部程式通過對此類成員函式的呼叫來實現對資料的操作。而定義為private的成員函式只可以被內部成員函式呼叫,稱為”工具函式“(utility function).要注意如果在宣告類時未指定成員的屬性,則系統預設為是private,那麼這樣的類是沒有任何意義的,因為它沒有對外介面,不能對外提供任何功能。之前的程式設計習慣是先宣告private屬性,但現在習慣先宣告public屬性,這樣使用者就可以集中關注類所提供的功能。

成員函式可以在類內宣告,類外定義,這是一種良好的習慣,可以減少類體程式碼的長度便於閱讀,而且把類的介面和類的實現分離,從而使類更像一個黑盒,資訊更隱蔽。可以這樣:先建立一個頭檔案:student.h

//student.h
class student{  //宣告一個類
public:
          void set (void);
          void display(void);         
private:
          int ID;
          char name[20];
          char sex;
          int age;
};
再建立一個.cpp檔案來實現成員函式:student.cpp
//student.cpp
#include "student.h"//包含類的宣告
#include <iostream>//用到了標準庫中的cout和cin函式
using namespace std;

void student::set(){
cout << "please input the information" << endl;
cin >> ID >> name >> sex >> age;
}
void student::display(){
cout << name << ID << sex << age<< endl;
}
由類定義的物件的成員函式的實現都是一樣的,只有資料成員是不一樣的。若為每個物件都分配獨立的資料和函式空間則是對有限記憶體的一種浪費。因此編譯器只給每個物件分配獨立的資料空間,而同一類定義的物件共享同一函式空間。通過this指標來分別是在呼叫哪個物件。要知道#include “   ”是一個預編譯命令,它用標頭檔案程式碼來覆蓋(替代)這個命令。因此標頭檔案是不可以單獨編譯的,只有是在包含了標頭檔案的.cpp檔案編譯時才會檢查它的語法錯誤。這樣就很清楚為什麼要在student.cpp中用#include “student.h”這個命令了。另外由於成員函式是在類體外定義的,故要加上作用域 student ::  這樣才能表明這時定義的set函式是student類的成員函式而不是普通的函式。不在標頭檔案中實現成員函式有它的好處:一個頭檔案可能會包含很多類,而所有要包含該標頭檔案的原始碼都會講標頭檔案的內容copy過去,這樣相同的成員函式就不用多次編譯,而只是在相應的成員函式實現的原檔案(student.cpp)中編譯一次就行了,提高了編譯的速度。最後通過連結器,就可形成.exe檔案了。