C++語言類的詳解和示例

超女選秀的例子我們玩了很久,為了教學的需要,暫時離開美眉們,我將採用實際項目開發的例子。


在C語言基礎知識中已學習過文件操作,在實際開發中,我會把文件操作封裝成一個類,類的聲明如下:


C++語言類的詳解和示例


類的聲明和成員函數的定義都是類定義的一部分,在實際開發中,我們通常將類的聲明放在頭文件中,而將成員函數的定義放在源文件中。


類成員的訪問權限

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的函數體如下:


構造函數

在CFile類的聲明中,有一個特殊的成員函數CFile(),它就是構造函數(constructor)。


構造函數的名字和類名相同,沒有返回值,不能被顯式的調用,而是在創建對象時自動執行。


構造函數具備以下特點:


1)構造函數必須是 public 屬性。


2)構造函數沒有返回值,因為沒有變量來接收返回值,即使有也毫無用處,不管是聲明還是定義,函數名前面都不能出現返回值類型,即使是 void 也不允許。


構造函數可以有參數,允許重載。一個類可以有多個重載的構造函數,創建對象時根據傳遞的參數來判斷調用哪一個構造函數。但是,在實際開發中,我很少重載構造函數,一是程序寫出來不漂亮,二是構造函數不能有返回值,能做的事情很有限,讓其它的成員函數去做就是了。


構造函數在實際開發中會大量使用,它往往用來做一些初始化工作,對成員變量進行初始化等,我基本上就是這麼用的。


析構函數

在CFile類的聲明中,還有一個特殊的成員函數~CFile(),它就是析構函數(destructor)。


析構函數的名字在類的名字前加~,沒有返回值,但可以被顯式的調用,在對象銷燬時自動執行,用於進行清理工作,例如釋放分配的內存、關閉打開的文件等,這個用途非常重要,可以防止程序員犯錯。


析構函數具備以下特點:


1)構造函數必須是 public 屬性的。


2)構造函數沒有返回值,因為沒有變量來接收返回值,即使有也毫無用處,不管是聲明還是定義,函數名前面都不能出現返回值類型,即使是 void 也不允許。


析構函數不允許重載的。一個類只能有一個析構函數。


C++程序也很優雅

很多人說C++程序很煩瑣,python程序很優雅,說這話人的很荒謬,那是因為他C++的功力不夠。


示例(book210.cpp)


類的其它知識

關於類的其它知識,包括this指針、static靜態成員、友元等內容,我不介紹了,大家可以找資料看看,也可以不看,意義不大,時間太寶貴,有太多重要的知識要學習,沒必要把時間浪費在這些不痛不癢又沒什麼用的知識點上,以後有時間了再看也行。


可變參數

我們已經介紹過printf、fprintf、sprintf、snprintf函數,它們是一組功能相似的函數,並且有一個共同點,就是函數的參數列表是可變的。


函數的聲明如下:


int printf(const char *format, ...);


int fprintf(FILE *stream, const char *format, ...);


int sprintf(char *str, const char *format, ...);


int snprintf(char *str, size_t size, const char *format, ...);


在實際開發中,我們的自定義函數也需要可變參數,實現類似上述函數的功能,例如CFile類的Fprintf成員函數,函數的聲明和定義如下:


va_list指針、va_start宏、va_end宏難以理解,大家會抄就行,我不詳細介紹,vfprintf函數把宏分析的結果輸出到文件,還有一系列功能相似的函數,聲明如下:


// 輸出的屏幕


int vprintf(const char *format, va_list ap);


// 輸出到文件


int vfprintf(FILE *stream, const char *format, va_list ap);


// 輸出到字符串


int vsprintf(char *str, const char *format, va_list ap);


// 輸出到字符串,第二個參數指定了輸出結果的長度,類似snprintf函數。


int vsnprintf(char *str, size_t size, const char *format, va_list ap);


可變參數的知識不只這些,但是,在實際開發中,我只見過用於格式化輸出,其它的應用場景我沒有見過。


版權聲明:本文為CSDN博主「C語言技術網-碼農有道」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:C++語言類的詳解和示例_c/c++_C語言技術網-碼農有道-CSDN博客


分享到:


相關文章: