用C语言实现面向对象程序设计

        众所周知C语言是一门面向过程的语言,它不像C++那样提供了类来将对象进行抽象。将对象的属性和行为进行封装。这是不是也就决定了C语言不能实现面向对象的编程了呢,其实也并非如此,C语言提供了结构体让我们把数据进行封装,同时也提供了函数指针,方便了行为的封装,用以下例子加以说明吧。

首先用C++实现一个Clock类,以便进行对比:

 

 
  
  1. #include <iostream>  
  2. using namespace std;  
  3. class Clock  
  4. {  
  5.    public:  
  6.        Clock();  
  7.        void setTime(int h,int m){hour=h; minute=m;}  
  8.        void showTime(){cout<<hour<<":"<<minute<<endl;}  
  9.     private:  
  10.         int hour;  
  11.         int minute;  
  12. };  
  13. int main()  
  14. {  
  15.       Clock c1;  
  16.       c1.setTime(10,30);  
  17.       c1.showTime();  

这是一个十分简单的类,稍微有点C++基础的人都能懂,那么用C语言怎么实现呢?

看以下的例子。

 

 
  
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. typedef struct tagClock  
  4. {  
  5.     int Hour;  
  6.     int Minuts;  
  7.     void (*SetTime)(struct tagClock *clock,int h,int m);  
  8.     void (*ShowTime)(struct tagClock *clock);  
  9. }Clock;  
  10. void SetTime(struct tagClock *clock,int h,int m)  
  11. {  
  12.     clock->Hour=h;  
  13.     clock->Minuts=m;  
  14. }  
  15. void ShowTime(struct tagClock *clock)  
  16. {  
  17.     printf("Hour=%d :",clock->Hour);  
  18.     printf("Minuts=%d\n",clock->Minuts);  
  19. }  
  20. int main(int argc,char *argv[])  
  21. {  
  22.     Clock c1={8,30,SetTime,ShowTime};  
  23.     c1.ShowTime(&c1);  
  24.     return 0;  
  25. }  

C 语言通过结构体和指针函数来实现面向对象程序的设计,这只是一个简单的例子,一种简单的封装思想,真正要实现面向对象,C语言是不如C++的,C++不仅提供了完美的封装还有访问权限的控制。

另外,在C++中其实结构体也相当于一个类,只不过里面的所有成员,都是公有的罢了,如下例子就说明了这一点。

 

 
  
  1. #include <iostream>  
  2.  
  3. using namespace std;  
  4. struct Clock  
  5. {  
  6.     int hour;  
  7.     int minute;  
  8.     void setTime(int h,int m);  
  9.     void showTime(){cout<<hour<<":"<<minute<<endl;}  
  10. };  
  11. void Clock::setTime(int h,int m)  
  12. {  
  13.     hour=h;  
  14.     minute=m;  
  15. }  
  16. int main()  
  17. {  
  18.     Clock c;  
  19.     c.setTime(10,30);  
  20.     c.showTime();  
  21.     return 0;  
  22. }  
  23.