C 语言中的面向对象编程






1.85/5 (9投票s)
2007 年 2 月 1 日
3分钟阅读

41487
本文介绍了传统 C 语言中的基于对象的编程。
引言
本文介绍了一种在传统 C 语言中设计面向对象编程概念的简单方法。
描述如下:
1. 请参考下面的代码,以便更好地理解描述。最后给出的代码实际上是一个可以工作的代码,不应该有任何编译和执行问题。
2. `struct A` 等价于任何面向对象编程语言中的 **'类'**。
3. A 的各种成员,例如 a、b、c,是类的数据成员。
4. A 的各种成员,例如 add、sub 和 print,是类的成员函数。 基本上它们是指向函数的指针,将在变量分配/创建后立即初始化。
5. 像 add、sub 和 print 这样的全局函数是最终会链接到类的函数指针的函数。将函数地址分配给函数指针的过程或步骤称为 ATTACH。宏 ATTACH 执行函数指针赋值。AXS 是 'ACCESS' 的缩写,意思是访问数据成员或成员函数。
6. 要访问数据成员,我们可以使用 C 中的标准 'dot' 运算符和结构变量。
7. 要使用对象(本例中为 'aa')调用 A 的成员函数,我们需要使用这个语法 obj.functionptr(obj 的地址)
8. 在此实现中,所有成员函数都应该至少有一个 `struct A *` 类型的参数。为了统一,我们可以专门将其作为 `struct A *this_ptr`。此指针(调用对象的地址)用于访问对象(aa 和 ab)的数据成员或成员函数。
9. 为什么此模型类似于 **面向对象编程模型**?在此模型中,内存实体 'aa' 和 'ab' 实际上是 'A' 类型的两个对象('A' 可以被认为是一个类)。这两个对象都有自己的数据成员和成员函数(成员函数实际上在所有对象之间共享)。
10. 其他可能性:可以扩展此模型,其中我们可以选择性地更改一个或多个成员函数指针以指向其他函数。因此,将使我们能够选择性地更改对象的行为。例如,这意味着 aa 的 'add' 函数可以将变量 'a' 和 'b' 加到 'c' 中 (c=a+b),同时 ab 的 'add' 函数可以将 'a' 和 'b' 的平方加到 c 中 (c=axa + bxb)。这种行为称为 **'函数重写'**。
11. 使用数据成员指针,我们也可以模拟 **'static'** 变量(对于数据成员和成员函数),类似于类(如 C++ 中)。 这些指针变量(或逻辑静态变量)需要在所有对象创建后进行初始化。
代码段
struct A
{
int a,b;
int c;
int (*add)();
int (*sub)();
int (*print)();
};
#define ATTACH_ALL_FOR_A(obj) {ATTACH(obj,add);ATTACH(obj,sub);ATTACH(obj,print);}
#define THIS this_ptr
#define DECLARE_THIS (*THIS)
#define AXS(X) (THIS->X)
#define ATTACH(obj,function) obj.function = function;
void print(struct A DECLARE_THIS)
{
printf("\nA: %d, B: %d, C: %d",AXS(a),AXS(b),AXS(c));
}
void add(struct A DECLARE_THIS)
{
AXS(c) = AXS(a) + AXS(b);
AXS(print(THIS));
}
void sub(struct A DECLARE_THIS)
{
AXS(c) = AXS(a) - AXS(b);
}
void main()
{
struct A aa,ab;
clrscr();
ATTACH_ALL_FOR_A(aa);
ATTACH_ALL_FOR_A(ab);
aa.a=4;
aa.b=1;
aa.add(&aa);
printf("aa.c: %d",aa.c);
printf("ab.c: %d",ab.c);
getch();
}