一 封裝(C物件導向開發)

2021-10-25 05:21:14 字數 3505 閱讀 7132

內容參考於《抽象接**術和元件開發規範及其思想》

在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.類和物件的區別 類 明確該事物的屬性和行為並定義在其中。物件 其實就是該類事...