內容參考於《抽象接**術和元件開發規範及其思想》在c語言中,可以使用乙個c檔案(.c 檔案)和**件完(*.h 檔案)成「類」的定義,將所有需要封裝的東西都存於c 檔案中,h 檔案中只展現那些對外可見、無需封裝(重點)的內容。
1. 示例1:
乙個棧物件的例子。
stack.h
#ifndef __stack_h
#define __stack_h
struct stack;
/* 型別宣告,無需關心類定義的具體細節 */
struct stack * stack_create (
int size)
;/* 建立棧,並指定棧空間的大小 */
int stack_push (
struct stack *p_stack,
int val)
;/* 入棧 */
int stack_pop (
struct stack *p_stack,
int*p_val)
;/* 出棧 */
int stack_delete (
struct stack *p_stack)
;/* 刪除棧 */
#endif
stack.c
#include
"stack.h"
#include
"stdlib.h"
/* for malloc */
struct stack
;struct stack *
stack_create
(int size)
free
(p_stack)
;/* 分配棧記憶體失敗 */
}return
null
;/* 建立棧失敗, 返回 null */
}int
stack_push
(struct stack *p_stack,
int val)
return-1
;}intstack_pop
(struct stack *p_stack,
int*p_val)
return-1
;}intstack_delete
(struct stack *p_stack)
if(p_stack->p_buf !=
null
)free
(p_stack)
;return0;
}
main.c
#include
"stack.h"
#include
"stdio.h"
intmain()
類具有屬性,它是對資料(物件的狀態) 的抽象。在 c 程式設計時, 通常使用結構體型別來表示乙個類,相關屬性即包含在相應的結構體型別中。
類具有方法,它是物件行為的抽象,用方法名和實現該操作的方法來描述。在 c 程式設計中,方法可以看作普通的函式,不過其通常有乙個特點: 函式的第乙個引數,為「類」型別的指標,該指標指向了乙個確定的物件,用以表明此次操作要作用於哪個物件, 在方法實現時,即可通過該指標訪問到物件中的各個屬性。
stack.h 的程式是沒有 struct stack 結構體成員的訪問許可權的,它們只能呼叫stack.h 檔案中宣告的方法: 建立(stack_create)、 刪除(stack_delete)、 入棧(stack_push) 、出棧(stack_pop)。對於外界使用者來說, struct stack 這個結構體的內部細節,以及各個函式的具體實現方式都是不可見的。 這正是完美的封裝!
2. 擴充套件
上面的示例中是通過malloc去獲取記憶體,記憶體**是受到限制的,雖然上面示例完美得展現了封裝,可是更多時候會使用以下的形式(建議都使用這種)。
stack.h
#ifndef __stack_h
#define __stack_h
struct stack
;int
stack_init
(struct stack *p_stack,
int*p_buf,
int size)
;/* 初始化 */
intstack_push
(struct stack *p_stack,
int val)
;/* 入棧 */
intstack_pop
(struct stack *p_stack,
int*p_val)
;/* 出棧 */
intstack_deinit
(struct stack *p_stack)
;/* 解初始化 */
#endif
stack.c
#include
"stack.h"
intstack_init
(struct stack *p_stack,
int*p_buf,
int size)
intstack_push
(struct stack *p_stack,
int val)
return-1
;}intstack_pop
(struct stack *p_stack,
int*p_val)
return-1
;}intstack_deinit
(struct stack *p_stack)
main.c
#include
"stack.h"
#include
"stdio.h"
intmain()
物件的建立交給了使用者,使用者喜歡怎麼建立都行,把物件和相相關引數提供給init初始化方法就行。所以不再需要create和delete,需要的是init和deinit(建構函式和析構函式)。
很明顯new乙個物件,使用的是示例一的方法,而這裡可以new也可以直接定義,把權力交給了使用者。
3. 個人觀點
c同樣是可以物件導向的,只不過因為編譯器不做限制,所以很多不物件導向的行為能夠編譯通過。所以這時候需要程式設計師自身的修養進行保證,例如上面,程式設計師保證不去訪問物件的成員,那麼成員就是封裝的。可是總有些沒修養的程式設計師喜歡去訪問物件的成員,所以出來了c++編譯器去禁止這種行為,只要訪問了私有的成員,那麼編譯器就報錯。所以…(好了,這是開玩笑,供c開發者yy)。
我閱讀過minix的**,作者為了加強c的物件導向,定義了如下巨集
#define public ""
public int a;
雖然最後預處理後還是int a;可是通過巨集進行了表述,更加明顯得表達了封裝的特性。 C 物件導向(一)封裝 類和物件
封裝 繼承 多型 封裝 組織 的過程,將 組織為乙個方法,將方法組織成類,將類組成元件,不同的元件組織為乙個系統。封裝可以方便使用者使用,並且能夠保證 的穩定性,安全性。類 一組相似物件的統稱。物件 乙個例項,是類的實現。類與物件的關係類物件 抽象具體 無狀態有狀態 是物件的模板 是類的例項 類與類...
js物件導向程式設計一 封裝
js是物件導向程式設計的語言,既是它的函式,陣列,屬性都是物件,可以設定物件的屬性和方法。一.生成物件的原始模式 假定把貓看成乙個物件,它有name和color兩個屬性.var cat 現在,我們需要根據這個原型物件的規格,生成兩個例項物件.var cat1 建立乙個空物件 cat1.name 大毛...
Java基礎 物件導向(一)封裝
一 什麼是物件導向?怎麼理解物件導向?1.物件導向的三個特點 a 物件導向就是一種常見的思想,符合人們的思考習慣。b 物件導向的出現,將複雜的問題簡單化。c 物件導向的出現,讓程靜在過程中的執行者,變成了物件中的指揮者。2.類和物件的區別 類 明確該事物的屬性和行為並定義在其中。物件 其實就是該類事...