C的面向对象编程


关于C面向对象编程的研究。

前段时间在知乎上看到一篇文章,一个大佬说面向对象是一种思想,用C也可以写出很好的面向对象的程序。

文章链接: https://www.zhihu.com/question/30567850/answer/2602179225

于是让我产生了一点好奇,所以就研究了一下C如何进行面向对象编程。

通过结构体和函数指针来模拟面向对象编程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义一个结构体,模拟一个类
typedef struct Person {
char name[50];
int age;

// 成员函数(通过函数指针实现)
void (*setName)(struct Person*, const char*);
void (*setAge)(struct Person*, int);
void (*display)(const struct Person*);
} Person;

// 成员函数的实现
void setName(Person* p, const char* name) {
strncpy(p->name, name, sizeof(p->name) - 1);
p->name[sizeof(p->name) - 1] = '\0'; // 确保字符串结束符
}

void setAge(Person* p, int age) {
p->age = age;
}

void display(const Person* p) {
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
}

// 创建一个新的 Person 实例
Person* createPerson(const char* name, int age) {
Person* p = (Person*)malloc(sizeof(Person));
if (p != NULL) {
p->setName = setName;
p->setAge = setAge;
p->display = display;
p->setName(p, name);
p->setAge(p, age);
}
return p;
}

// 释放 Person 实例
void destroyPerson(Person* p) {
free(p);
}

int main() {
// 使用模拟的面向对象方式
Person* person = createPerson("Alice", 30);
person->display(person);

// 修改对象的属性
person->setName(person, "Bob");
person->setAge(person, 25);
person->display(person);

// 清理
destroyPerson(person);
return 0;
}