
以U +结构名称作为原始类的析构函数的实现;
Fun -_ +结构名称指向结构成员的函数指针;
以上情况将在以后不再解释.
一个. 类的成员函数和数据成员
由于该结构不控制成员的访问权限,因此必须添加其他机制来控制访问,这会使程序变得复杂,因此您只能放弃访问控制.
1)该类的数据成员可以直接转换为C中结构的数据成员.
2)该函数需要转换为相应的函数指针构造函数 内联函数,因为该结构中不允许使用函数的声明和定义. 并且如果在函数之前有virture,inline和其他修饰符,例如函数void funca(int a);更改为void(* funca)(结构B * p,int a);您可以看到函数指针的原型Riga A指向结构struct B的指针,这是因为要对函数内的类的成员进行操作,依靠指针来指定结构的成员. 在类的成员函数中,实际上在参数列中有一个指向自身的this指针.
3)对于静态成员,必须将它们定义为全局变量或全局函数,因为结构中不能有静态成员.
两个. 类构造器
实例化该类时,将调用该类的默认构造函数. 在结构中,必须定义相同名称的函数指针,以指向带有构造函数的初始化函数. 与构造函数不同,它必须在初始化函数中添加一条语句以初始化函数指针. 使用它时,在创建结构变量时,请使用malloc而不是new,并在此时手动调用初始化函数.
如以下示例所示:
A类{public: A(); 〜A(); void func(int a);私人: int b;}; A :: A(){b = 0;}

void A :: func(int a){b = a;}
typedef struct classA A; struct classA {void(* A)(struct classA * p); //构造函数指针void(* U)(struct classA * p); //析构函数指针void(* func)(Struct classA * p,int a); int b;};
void fun_A(A * p){p-》 func = classA_func; //初始化函数指针}
void IA(A * p)//构造函数,命名规则在类名之前添加I {fun_A(p); p-》 b = 0; //原始构造函数的一部分}
void classA_func(A * p,int a){p-》 b = a;}
使用以下方法代替地方:
A * s =(A *)malloc(sizeof(A)); s-》 A = IA; s-》 A(s);

三个. 类析构函数
破坏者的工作
class是释放占用的资源.
在C中,无论使用哪种结构,函数指针U都会替换析构函数. 所有结构使用指针U的原因是基于以下情况:

如果将子类指针分配给基类指针,则基类指针无需考虑释放时要调用的函数名称析构函数,只需调用成员函数U. 需要指定成员函数U在fun_class name()函数中,就像常规成员函数一样.
破坏者
类是由系统调用的,但必须在C中显式调用. 关于何时调用,必须进行准确判断.
四个. 复制类的构造函数
在以下情况下,类的副本构造函数的主要目的是加快类的构建:
1. 作为参数传递给函数. (附加项(Itema))
2. 返回值作为函数.
3. 作为实例化类时的参数.
在所有三种情况下,系统都直接调用类的副本构造函数,而不是构造函数.
注意: C = D;复制构造函数未调用. 在这种情况下,将使用重载的“ =”运算符. (有关详细信息,请参见运算符重载);
由于struct变量是在C语言中定义的,因此将使用所有指针,并且不使用copy构造函数,因此我暂时不考虑它. 对于需要类变量的原始函数参数或返回值,必须全部转换为类指针. 当将该类实例化为参数时,可以通过另外定义一个带有参数的构造函数来解决.
五个. 该类的内联和虚函数

应该删除用于内联函数和虚拟函数的内联和虚拟修饰符. 应删除内联函数主体,并将内联函数定义为外部函数. 如:
B类{…virted void funb();内联int add()const {return a + b;}; private: int a; int b; …}
更改为:
typedef classB B; struct classB {…void(* funb)(struct classB * p); int(* add)(结构类B * p);诠释int b;}
void classB_funb(B * p){…}
int classB_add(B * p){返回p-》 a + p-》 b;}
void fun_classB(B * p){…p-》 funb = classB_funb; p-》 add = classB_add;}
六. 超载
类重载中有两种类型的函数重载和运算符重载:
1)函数重载
函数重载的条件如下: 函数名称相同,参数数量或参数类型不同.
这样,在调用时,将根据您输入的不同参数调用不同的函数.

在C语言中,您必须提供不同的名称,并且没有其他解决方案.
2)运算符重载
运算符重载只是为了满足使用无错误运算符的一般习惯.
C不支持运算符重载,您可以定义一个函数来实现此功能.
这是常规的类修改.
VII. 类继承
1)单继承
如果类之间存在继承关系,请首先根据常规类修改基类. 然后将基类的所有定义复制到子类的头部. 除了将基类构造函数的名称更改为子类构造函数的名称之外,不能对基类定义的部分进行其他更改. 并在构造函数中调用基类的构造函数,然后,如类覆盖了基类的函数,则应将函数指针重定向到子类函数. 这是为了维护类继承带来的动态链接功能.
类之间的继承关系是复杂且可变的. 为了确保基类是唯一的,并且在所有子类中都可以方便地进行修改,最好的方法是使基类的结构部分成为宏. 可以直接使用.
2)多重继承
我个人认为多重继承最好不要使用,他会带来一些问题,会有多重继承路径的问题. 除非使用它来简化编程,例如继承接口等.
也可以更改多个继承. 多个基类的所有成员都被复制到子类中. 如果遇到重复的成员名称,则通过在前面添加前缀来区分它们. 当然,这是指基类. 同样,如果派生类和基类之间的名称重复构造函数 内联函数,则基类将被覆盖.
八. 其他
以上是C ++的主要,最常用的功能和修改方法,它们与C的区别最大. 其他(例如,模板的使用)是为了方便编程和重用代码. 不是用C语言编写的,因此我必须编写多个函数来分别实现. 此外,参数列表中的&符号应替换为指针,并且默认值也应删除,并且在调用时应写入默认值.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-282747-1.html
但绝对不能剥夺公民议论社会
我想这样就好了