C 語言類的詳解和示例

2021-09-25 21:08:55 字數 3522 閱讀 8089

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

在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++程式很煩鎖,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);

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

如果這篇文章對您有幫助,請點贊支援,或在您的部落格中**我的文章,謝謝!!!

c語言左移和右移的示例詳解

邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。算術移位指令 算術移位指令有 算術左移sal shiftalgebraic 程式設計客棧left 和算術右移sar shift...

C語言printf函式詳解和示例

c語言格式化輸出的函式有printf sprintf和snprintf等,功能略有不同,使用方法大同小異,本文以printf函式為例來介紹它們的用法。int printf const char format,大家看到printf函式的宣告就會有點懵,它引數的寫法與我們之前學到的函式知識不一樣,pri...

C 語言string類介紹和示例

在c語言中,用0結尾的字元陣列表示字串,c的字串有乙個問題,就是定義後大小不能改變,存入的內容只能比陣列小,不能大,如果不小心存多了,會引起記憶體的溢位,這個問題讓程式設計師很鬱悶。c 的string部分的解決了這個問題,它會隨存放字元的長度自動伸縮,程式設計師不必擔心記憶體溢位的問題。string...