談及封裝,大多數人首先會想到物件導向設計。封裝其實是乙個泛型的概念,雖然在物件導向設計中更容易體現出來,卻也能夠在面向過程的語言中找到應用領域。在本文中,我**下 c 語言中涉及到的封裝概念。
函式有引數、執行塊、返回值等資訊。這些資訊描述了乙個功能實現的各個抽象方面。引數表示過程執行的依賴條件,返回值表示過程執行產生的結果。這樣的描述對於純函式完全適合。
所謂純函式指的就是那些返回結果只依賴引數且沒有***的函式。對於具有***的函式而言,這一描述不算特別恰當。實際 c 語言程式設計中我們在大多數時候都依賴函式的***來完成工作,使用純函式程式設計的方法多見於函式式語言中,如 lisp 、scheme 等。
c 語言中的函式是對過程的封裝,這一封裝過程可以不斷地向上發展。我們從最初的小函式開始封裝基礎的功能,然後這些函式又成為更高一層呼叫函式的封裝元素。
這樣一層層的封裝下去,我們將得到乙個層次較為分明的系統。每一層做的具體過程都封裝到了許多函式中,各層之間通過固定的介面傳遞資訊,這樣當需要修改時大部分時間內只修改本層的函式即可完成任務,其它層的函式可以完全不用修改!
語句塊是對多個執行語句的封裝。在 c 語言中語句一定歸屬於乙個 block 中。拋開引數與返回值不談,函式其實也就是乙個、多個執行塊。不過這裡說的執行塊並不需要像函式一樣的引數與返回值,語句塊中的語句執行所產生的***卻可能與函式執行相同。
語句塊可以巢狀。每一級語句中定義的區域性變數可以看做本語句塊的內部屬性封裝,子語句塊中的重名區域性變數將覆蓋父語句塊中的變數。
c 語言中的復合資料結構——結構體提供了對資料結構進行封裝的方法。結構體與物件導向語言中的類頗有相同之處,只是更為簡單。
結構體的元素既可以是基本資料型別,也可以是復合資料型別,這點無疑極大的增強了結構體的封裝能力。
c 語言中的結構體並不存在類似物件導向語言的類中對屬性進行訪問控制的方法,它更接近資料結構本身。通過對不同型別的資料進行封裝,我們完成了類似設計類的工作。封裝得到的資料結構不僅能夠描繪出物件的各種屬性,也限定了基於此資料結構的操作。你也可已將對此資料結構操作的函式以虛函式表的形式封裝到結構體中,這樣結構體便有了類似物件導向類中的成員與方法,這也是使用 c 語言實現物件導向的常見操作。
我們之前在描述 block 中的封裝時提到了每乙個 block 中定義的區域性變數僅對當前 block 中的語句可見,子 block 中的重名區域性變數將覆蓋父 block 中的區域性變數。這便是一種對作用域的封裝。這樣的封裝方式限定了變數的可見範圍,降低了在不同地方修改變數導致問題的概率。
c 語言中可以使用全域性變數。全域性變數具有全域性作用域,常常會因為不同地方的多個修改而造成問題。c 語言中提供了 static 關鍵字來修飾變數。實際上這一關鍵字既可以用於變數也可用於函式。用於變數時既表示對變數的作用範圍進行封裝,也表示變數的儲存型別為靜態型別。用於函式時則僅僅表示對函式的作用範圍進行封裝。
static 關鍵字修飾變數時,變數的作用範圍最大為當前 .c 檔案,最小則是在乙個 block 中,後一種使用方式並不常見。
在乙個 block 中定義乙個 static 型別的變數會一直占用空間,不像棧中儲存的變數,可以隨著棧的增減而動態建立**。
static 關鍵字修飾函式時,函式的作用範圍僅限於當前的 .c 檔案。c 語言並不支援函式的巢狀定義,因此此作用範圍的大小是固定的。一般在開發中,所有不需要對外部提供的函式最好都定義為 static 型別,這樣此函式名僅僅作用與當前的原始檔,我們就可以在其它的原始檔中定義相同名字的函式而不用擔心編譯器報重複定義的錯誤了。
本文描述了 c 語言中封裝的三種應用——對過程的封裝、對資料結構的封裝、對作用域的封裝。通過對這三種類別封裝的描述,我們可以看到封裝不僅僅是物件導向語言中常見的特性,在面向過程語言中也有較多的應用。應該說封裝是一種思想而非具體的技術,這樣我們便能夠在更廣闊的層次去解釋封裝,對語言的認識也能更進一步!
C語言中的 ,
c語言中的 今天在分析乙份原始碼的時候遇到了如下 define uf call x report file line x,x static int report char file,int line,char call,int irc return irc 網上參考 cpp view plain c...
C語言中的
c語言中的 今天在分析乙份原始碼的時候遇到了如下 覺得其中的 很有意思,於是就將這個知識點整理一下。和 都是預處理指令,我們先看 用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 ...
C語言中的 ,
用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 sqr 8 則輸出為 the square of x is 64.注意到沒有,引號中的字元x被當作普通文本來處理,而不是被當作乙個...