1. 程式人生 > >C++類的詳解

C++類的詳解

[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 */ #