构造函数模式
本课属于 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);
注意,构造函数会处理所有繁琐的细节:分配结构体、为字符串分配空间,以及复制数据。调用者只需提供初始值,就能获得一个可直接使用的对象。这样可以将创建逻辑封装在一处,让你的代码更简洁,也更不容易出错。
挑战
简单我们来构建一个使用构造函数模式在堆上创建图书对象的 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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器