C++類的詳解
阿新 • • 發佈:2020-03-15
[toc]
超女選秀的例子我們玩了很久,為了學習的需要,暫時離開美眉們,我將採用實際專案開發的例子來講解類的更多知識。
在C語言基礎知識中已學習過檔案操作,在實際開發中,為了提高效率,我會把檔案操作封裝成一個類,類的宣告如下:
```cpp
// 檔案操作類宣告
class CFile
{
private:
FILE *m_fp; // 檔案指標
bool m_bEnBuffer; // 是否啟用緩衝區,true-啟用;false-不啟用
public:
CFile(); // 類的建構函式
CFile(bool bEnBuffer); // 類的建構函式
~CFile(); // 類的解構函式
void EnBuffer(bool bEnBuffer=true); // 啟、禁用緩衝區
// 開啟檔案,引數與fopen相同,開啟成功true,失敗返回false
bool Open(const char *filename,const char *openmode);
// 呼叫fprintf向檔案寫入資料
void Fprintf(const char *fmt, ... );
// 呼叫fgets從檔案中讀取一行
bool Fgets(char *strBuffer,const int ReadSize);
// 關閉檔案指標
void Close();
};
```
一、類成員的訪問許可權
====================
C++通過 public、protected、private三個關鍵字來控制成員變數和成員函式的訪問許可權,它們分別表示公有的、受保護的、私有的,被稱為成員訪問限定符。所謂訪問許可權,就是類外面的程式碼訪問該類中成員許可權。
在類的內部,即類的成員函式中,無論成員被宣告為 public、protected 還是private,都是可以互相訪問的,沒有訪問許可權的限制。
在類的外部(定義類的程式碼之外),只能通過物件訪問public的成員,不能訪問 private、protected屬性的成員。
本節重點介紹 public 和 private,protected 將在以後介紹。
private 後面的成員都是私有的,如m_fp和m_bEnBuffer,直到有 public出現才會變成共有的;public 之後再無其他限定符,所以 public後面的成員都是共有的。
private關鍵字的作用在於更好地隱藏類的內部實現,該向外暴露的介面(能通過物件訪問的成員)都宣告為public,不希望外部知道、或者只在類內部使用的、或者對外部沒有影響的成員,都建議宣告為private。
宣告為 private 的成員和宣告為 public 的成員的次序任意,既可以先出現 private部分,也可以先出現 public 部分。如果既不寫 private 也不寫 public,就預設為private。
在一個類體中,private 和 public可以分別出現多次。每個部分的有效範圍到出現另一個訪問限定符或類體結束時(最後一個右花括號)為止。
您可能會說,將成員變數全部設定為 public 省事,確實,這樣做 99.9%的情況下都不是一種錯誤,我也不認為這樣做有什麼不妥;但是,將成員變數設定為private 是一種軟體設計規範,尤其是在大中型專案中,還是請大家儘量遵守這一原則。
二、成員變數的命名
==================
成員變數大都以m_開頭,這是約定成俗的寫法,不是語法規定的內容。以m_開頭既可以一眼看出這是成員變數,又可以和成員函式中的引數名字區分開。
例如成員函式EnBuffer的函式體如下:
```cpp
// 啟、禁用緩衝區
void CFile::EnBuffer(bool bEnBuffer)
{
m_bEnBuffer=bEnBuffer;
}
```
三、建構函式
============
在CFile類的宣告中,有一些特殊的成員函式CFile(),它就是建構函式(constructor)。
```cpp
CFile(); // 類的建構函式
CFile(bool bEnBuffer); // 類的建構函式
```
建構函式的名字和類名相同,沒有返回值,不能被顯式的呼叫,而是在建立物件時自動執行。
建構函式具備以下特點:
1)建構函式必須是 public 屬性。
2)建構函式沒有返回值,因為沒有變數來接收返回值,即使有也毫無用處,不管是宣告還是定義,函式名前面都不能出現返回值型別,即使是void 也不允許。
3)建構函式可以有引數,允許過載。一個類可以有多個過載的建構函式,建立物件時根據傳遞的引數來判斷呼叫哪一個建構函式。
4)建構函式在實際開發中會大量使用,它往往用來做一些初始化工作,對成員變數進行初始化等,注意,不能用memset對整下類進行初始化。
示例
```cpp
CFile::CFile() // 類的建構函式
{
m_fp=0;
m_bEnBuffer=true;
}
CFile::CFile(bool bEnBuffer) // 類的建構函式
{
m_fp=0;
m_bEnBuffer=bEnBuffer;
}
```
四、解構函式
============
在CFile類的宣告中,還有一個特殊的成員函式\~CFile(),它就是解構函式(destructor)。
```cpp
~CFile(); // 類的解構函式
```
解構函式的名字在類的名字前加\~,沒有返回值,但可以被顯式的呼叫,在物件銷燬時自動執行,用於進行清理工作,例如釋放分配的記憶體、關閉開啟的檔案等,這個用途非常重要,可以防止程式設計師犯錯。
解構函式具備以下特點:
1)建構函式必須是 public 屬性的。
2)建構函式沒有返回值,因為沒有變數來接收返回值,即使有也毫無用處,不管是宣告還是定義,函式名前面都不能出現返回值型別,即使是void 也不允許。
3)解構函式不允許過載的。一個類只能有一個解構函式。
```cpp
CFile::~CFile() // 類的解構函式
{
Close(); // 呼叫Close釋放資源
}
```
五、C++程式也很優雅
===================
很多人說C/C++程式很煩鎖,python程式很優雅,說這話人的很荒謬,那是因為他C/C++並不瞭解,只要我們願意,可以寫出和python一樣優雅簡潔的程式碼,在book210.cpp中,main函式的程式碼極為精簡。
示例(book210.cpp)
```cpp
/*
* 程式名:book210.cpp,此程式演示用C++類的更多知識。
* 作者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#