在物件導向的語言裡面,出現了類的概念。這是程式設計思想的一種進化。所謂類:是對特定資料的特定操作的集合體。所以說類包含了兩個範疇:資料和操作。而c語言中的struct僅僅是資料的集合。(
li******[email protected])
1.例項:下面先從乙個小例子看起
#ifndef c_class
#define c_class struct
#endif
c_class a ;
c_class b;
void b_f2(c_class b *bthis)
void a_foo(c_class a *athis)
void b_foo(c_class b *bthis)
void a_creat(struct a* p)
void b_creat(struct b* p)
int main(int argc, char* argv)
輸出結果:
11it is b.c=13
it is a.a=1
it is b_fun
2.類模擬解說:
我在網上看見過一篇文章講述了類似的思想(據說c++程式設計思想上有更加詳細的解說,可惜我沒空看這個了,如果有知道的人說一說吧)。但是就象c++之父說的:「c++和c是兩種語言」。所以不要被他們在語法上的類似就混淆使用,那樣有可能會導致一些不可預料的事情發生。
其實我很同意這樣的觀點,本文的目的也不是想用c模擬c++,用乙個語言去模擬另外乙個語言是完全沒有意義的。我的目的是想解決c語言中,整體框架結構過於分散、以及資料和函式脫節的問題。
c語言的一大問題是結構鬆散,雖然現在好的大型程式都基本上按照乙個功能乙個檔案的設計方式,但是無法做到更小的顆粒化――原因就在於它的資料和函式的脫節。類和普通的函式集合的最大區別就在於這裡。類可以例項化,這樣相同的函式就可以對應不同的例項化類的變數。
自然語言的乙個特點是概括:比如說表。可以說手錶,鐘錶,秒錶等等,這樣的描述用物件導向的語言可以說是抽象(繼承和多型)。但是我們更要注意到,即使對應於手錶這個種類,還是有錶鏈的長度,表盤的顏色等等細節屬性,這樣細微的屬性如果還用抽象,就無法避免類膨脹的問題。所以說類用成員變數來描述這樣的屬性。這樣例項並初始化不同的類,就描述了不同屬性的物件。
但是在c語言中,這樣做是不可能的(至少語言本身不提供這樣的功能)。c語言中,如果各個函式要共享乙個變數,必須使用全域性變數(乙個檔案內)。但是全域性變數不能再次例項化了。所以通常的辦法是定義乙個陣列。以往c語言在處理這樣的問題的時候通常的辦法就是這樣,比如說socket的號,handel等等其實都是陣列的下標。(不同的連線對應不同的號,不同的視窗對應不同的handel,其實這和不同的類有不同的成員變數是乙個意思)
個人認為:兩種形式(陣列和模擬類)並無本質的區別(如果不考慮虛函式的應用的話),它們的唯一區別是:陣列的辦法將空間申請放在了「模組」內,而類模擬的辦法將空間申請留給了外部,可以說就這一點上,類模擬更加靈活。
3.其他的話:
我的上述思想還是很不成熟的,我的目的是想讓c語言程式設計者能夠享受物件導向程式設計的更多樂趣。我們僅僅面對的是浩瀚的「黑箱」,我們的工作是堆砌**,而且如果要更改**功能的時候,僅僅換乙個黑箱就可以了。
而更大的目的是促使這樣的黑箱的產生。或許有一天,一種效率很好,結構很好的語言將會出現。那個時候程式設計是不是就會象說話一樣容易了呢?
作者blog:http://blog.csdn.net/li******1978/
C語言中的面向對像
使用c語言實現c 物件導向的功能 cpp view plain copy print?用 c 語言實現類的繼承,並且可用父類指標操作子類對像的乙個測試例子 author tomken.zhang include include include 定義乙個動物類,有二個方法 struct v anima...
C語言中體現物件導向的地方
c語言中 1.實現封裝的方式 用結構體來進行封裝,這樣便於對物件進行操作 2.實現多型 用函式指標來實現 include int add int num1,int num2 int cal int p int,int int num1,int num2 int main 3.在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...