Menu
CoddyTech

构造函数模式

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

在 Java 或 C++ 等语言中,你可以使用构造函数创建对象:构造函数是特殊的函数,会自动分配内存并初始化字段。C 没有这样的功能,但我们可以用一个简单的模式来模拟:create_ 函数。

C 中的构造函数通常会完成三件事:使用 malloc 分配内存,将所有字段初始化为合适的值,并返回指向新对象的指针:

typedef struct {
    char *name;
    int age;
} Person;

Person *create_person(const char *name, int age) {
    Person *p = malloc(sizeof(Person));
    p->name = malloc(strlen(name) + 1);
    strcpy(p->name, name);
    p->age = age;
    return p;
}

这个函数返回一个指针,因为对象存储在堆上,而不是栈上。这意味着函数返回后,对象仍然存在,并且可以自由传递。调用方这样使用它:

Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);

注意,构造函数会处理所有繁琐的细节:分配结构体、为字符串分配空间,以及复制数据。调用者只需提供初始值,就能获得一个可直接使用的对象。这样可以将创建逻辑封装在一处,让你的代码更简洁,也更不容易出错。

challenge icon

挑战

简单

我们来构建一个使用构造函数模式在堆上创建图书对象的 Book 模块。你将练习编写一个 create_ 函数,由它处理所有内存分配和初始化工作,并返回一个可直接使用的指针。

你将创建三个文件:

  • book.h:声明一个包含两个成员的 Book 结构体:char *title(指向动态分配的字符串的指针)和 int pages。另外,还要声明构造函数 create_book,它接收书名字符串和页数,然后返回指向新创建的 Book 的指针。使用符号 BOOK_H 作为头文件保护宏。
  • book.c:实现 create_book 函数。构造函数应先为 Book 结构体本身分配内存,然后为书名字符串单独分配内存(记得为空终止符留出空间),将书名复制到新内存中,设置 pages 字段,并返回指向新 Book 的指针。
  • main.c:使用构造函数创建一本书,并显示它的信息。

你会收到两个输入:书名(字符串)和页数(整数)。

在主文件中,使用 create_book 根据提供的值创建一本新书,然后按以下格式打印它的信息:

Title: {title}
Pages: {pages}

例如,输入 The C Programming Language 和 272 时,输出如下:

Title: The C Programming Language
Pages: 272

请记住,构造函数封装了所有创建逻辑:调用者只需提供初始值,就能获得一个已完全初始化、可直接使用的对象。

亲手试试

#include <stdio.h>
#include <stdlib.h>
#include "book.h"

int main() {
    char title[256];
    int pages;
    
    // 读取输入
    fgets(title, sizeof(title), stdin);
    // 如果有换行符,就将其删除
    for (int i = 0; title[i]; i++) {
        if (title[i] == '\n') {
            title[i] = '\0';
            break;
        }
    }
    scanf("%d", &pages);
    
    // TODO: 使用 create_book 和给定的值创建一本新书
    
    // TODO: 按要求的格式输出图书信息:
    // 书名:{title}
    // 页数:{pages}
    
    // TODO: 完成后别忘了释放已分配的内存
    
    return 0;
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: C 在线编译器