Menu
CoddyTech

结构体作为对象

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 6 课,共 61 课。

在面向对象的语言中,对象是将数据(状态)与操作这些数据的函数(方法)组合在一起的实体。C 没有内置对象,但我们可以使用结构体和函数实现相同的概念。

可以把结构体看作对象的“数据”部分。它保存对象的状态,也就是定义对象当前状态的值:

typedef struct {
    int value;
} Counter;

这个 Counter 结构体表示一个只有一项状态的实体:它的当前值。要为它添加行为,我们编写接受该结构体作为参数的函数:

void counter_increment(Counter *c) {
    c->value++;
}

int counter_get(Counter *c) {
    return c->value;
}

这些函数的作用类似于方法。它们专门处理 Counter 数据。通过将结构体传递给函数,我们模拟了其他语言在调用 counter.increment() 时自动执行的操作。

int main() {
    Counter my_counter = {0};
    counter_increment(&my_counter);
    printf("%d\n", counter_get(&my_counter)); // 输出:1
    return 0;
}

命名约定 typename_action(例如 counter_increment)有助于整理代码,并清楚地表明函数属于哪个结构体。这种模式是 C 中面向对象编程的基础。

challenge icon

挑战

简单

让我们构建一个简单的 Counter 模块,把结构体当作具有行为的对象来使用。你会把代码组织在 3 个文件中,练习将数据与操作这些数据的函数打包在一起的模式。

你需要创建 3 个文件:

  • counter.h:头文件,声明包含一个 int value 成员的 Counter 结构体。还要声明两个充当计数器“方法”的函数:counter_increment(接收指向 Counter 的指针,并将它的值加 1)和 counter_get(接收指向 Counter 的指针,并返回它当前的值)。使用符号 COUNTER_H 设置包含保护。
  • counter.c:源文件,实现这两个函数。记得包含头文件。
  • main.c:主文件,创建一个 Counter,对它执行操作,并显示结果。

你会收到两个整数输入:计数器的起始值和递增的次数。

在主文件中,用起始值初始化一个 Counter,然后按指定次数调用 counter_increment。最后,使用 counter_get 获取并打印最终值。

按以下格式打印结果:

Final value: {result}

例如,起始值为 5,递增 3 次时,输出为:

Final value: 8

亲手试试

#include <stdio.h>
#include "counter.h"

int main() {
    // 读取输入
    int starting_value;
    int num_increments;
    scanf("%d", &starting_value);
    scanf("%d", &num_increments);
    
    // TODO:创建一个 Counter,并用 starting_value 初始化它
    
    // TODO:按指定次数调用 counter_increment
    
    // TODO:用 counter_get 获取最终值并打印
    // 打印格式:"Final value: {result}"
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器