如何把C++的源代码改写成C代码的方法

2020-07-08 11:02:43王冬梅

在使用的地方采用如下方式:

A *s=(A*)malloc(sizeof(A)); 
  s->A=IA; 
  s->A(s); 

三、类的析构函数

类的析构函数所作的工作是释放所占的资源。

在C中,无论是哪个struct都用函数指针U替代析构函数。之所以所有的struct都用指针U是基于如下情况:

如果将子类指针赋给基类指针,基类指针在释放的时候不必考虑调用哪个函数名的析构函数,只需调用成员函数U即可。成员函数U需要像一般成员函数一样在fun_类名()函数中指定。

类的析构函数是由系统调用的,在C中则要显式调用。至于何时调用,要准确判断。

四、类的拷贝构造函数

类的拷贝构造函数主要用途是加快以下情况下类的构建速度:

作为参数传给函数。(additem(Itema)) 作为函数返回值。  实例化类时作参数。

这三种情况下都是由系统直接调用类的拷贝构造函数而不是构造函数。

注意:C=D;不会调用拷贝构造函数,这种情况下使用的是重载‘='运算符的方法。(详见运算符重载);

由于C中定义struct变量的时候,使用的全部是指针,不会用到拷贝构造函数,所以暂不考虑。对于原来函数参数或者返回值需要类变量的,要全部转化为类指针的方式。实例化类时作参数的情况,可以通过另外定义一个带参数的构造函数来解决。

五、类的内联函数和虚函数

内联函数和虚函数的修饰符inline 、virture 要全部去掉。内联函数体则要去掉,将内联函数在外面定义成一个函数。如:

class B 
{ 
  … 
  virture void funb(); 
  inline int add()const {return a+b;}; 
private: 
  int a; 
  int b; 
  … 
} 

改为:

typedef classB B; 
struct classB 
{ 
  … 
  void (*funb)(struct classB *p); 
  int (*add)(struct classB *p); 
  int a; 
  int b; 
} 
 
void classB_funb(B *p){ 
   … 
} 
 
int classB_add(B *p){ 
   return p->a+p->b; 
} 
 
void fun_classB(B *p){ 
   … 
   p->funb=classB_funb; 
   p->add= classB_add; 
} 

六、重载

类中重载有函数重载和运算符重载两种:

1)函数的重载

函数重载满足的条件是:函数名相同,参数个数或者参数类型不同。

这样在调用的时候,会根据你输入的参数不同,调用不同的函数。

在C中只好分别起不同的名字,没有别的解决办法。

2)运算符重载

运算符重载只是为了满足一般的运算符使用的习惯而又不会出现错误。

C中不支持运算符重载,可以定义一个函数实现该功能。

这是一般类的修改。