C语言实现面向对象

from : https://blog.csdn.net/vic_chang/article/details/8457800

C语言是面向过程的语言,可以用来实现面向对象么?答案是肯定的。

面向对象的本质是一种设计思想,与具体的语言没有多大的关系。C语言不是面向对象语言却也可以用来实现面向对象思想的。
有人会觉得用C实现面向对象,充其量是模拟面向对象的语法,而不是像C++那样真的面向对象的。这也算是不太正确的看法的。
为什么这么说?
请先看看C++的类与对象吧
class student
{
  public:
     Int getNum() 
     {
}
  private:
     Int num;
};
这是一个基本的C++类的声明,当使用这个类定义一个东西的时候,如:
student one;
编译器也就为one 这个对象只为数据成员分配了空间,即为 int num; 分配了空间,
没有为所谓 getNum()方法来分配任何东西的。
如果用C来写,就可以这样写:
struct student
{
   Int num;
};
 Int getNum()
{
}
用C写的这段code与C++写的那段code本质是等效的。
不过,有人要说了,C++声明的student类会有构造函数及析构函数,你的C语言就没有。。
OK,我们先给上述C++的code加上一个构造函数。
class student
{
  public:
    student(int number=0){num = number;}
  private:
    Int num;
};
在定义一个student one(1);时, 构造函数就会被调用。
构造函数是怎么被调用的呢??我们好象看不到调用呢??
我们之所以看不到,其实是因为编译器在生成代码的时候,已经在定义后面加入了调用的代码了,这个过程程序员没有参与。也就是等效于:
 student one; //定义一个对象
 student(1); //调用构造函数,由编译器加入的代码。

好了,明白这点,那么,我们的C语言也可以写构造函数了。
struct student
{
   Int num;
};

void student(int number, struct student * p)
{
   p->num = number;
}

struct student one;   //定义一个结构体对象
student(1, &one);   //构造函数

写到现在,用C语言实现面向对象主要有以下几点:
1. 在内存分配上,struct 类型与class类型数据是一样的,都只是存储数据的。类的成员函数跟普通函数是一样编译存储的。它所以能跟类关联在一起,实际是由编译器在保证的。用C语言来写的时候,这个关联性由程序员来控制。

2. 对象的构造函数与析构函数的调用,其实是由编译器在做调用。编译器在生成最终的二进制代码的时候,加入了它们的调用代码。类的其他特性也是如此。

3.  类的访问控制private, public, protected这些特性都是由编译器来保证的。最终生成的代码没有这些属性的。
4. 用C实现面向对象,其实就是把C++中编译器把所做的部分工作,转为由程序员来做。这样造成的结果无非就是程序员多写一点代码而已。在编译生成的最终汇编代码中,C所实现的面向对象是可以与C++的面向对象保持一致的code.

猜你喜欢

转载自blog.csdn.net/heybeaman/article/details/80262370