C语言封装是指将一组相关的数据和操作组合在一起,形成一个独立的模块,封装可以提高代码的可读性、可维护性和复用性,在C语言中,封装主要通过结构体(struct)和函数来实现。
结构体(struct)
结构体是C语言中一种用户自定义的数据类型,它可以包含多个不同类型的成员变量,结构体的定义和使用如下:
1、定义结构体
struct 结构体名 { 数据类型 成员变量1; 数据类型 成员变量2; ... };
定义一个表示点的结构体:
struct Point { int x; int y; };
2、使用结构体
结构体可以作为变量、数组、指针等数据类型来使用,声明一个结构体变量、结构体数组和结构体指针:
struct Point p1, p2; // 声明结构体变量 struct Point points[3]; // 声明结构体数组 struct Point *p3; // 声明结构体指针
函数封装
函数是C语言中实现封装的主要手段,通过将一组相关的操作封装在一个函数中,可以提高代码的可读性和复用性,函数的定义和使用如下:
1、定义函数
返回值类型 函数名(参数列表) { // 函数体 }
定义一个计算两点之间距离的函数:
#include <math.h> #include "Point.h" // 引入结构体定义文件 double distance(struct Point p1, struct Point p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return sqrt(dx * dx + dy * dy); }
2、使用函数
在需要使用函数的地方,通过函数名和参数列表来调用函数,计算两个点之间的距离:
#include <stdio.h> #include "Point.h" // 引入结构体定义文件 #include "distance.h" // 引入函数定义文件 int main() { struct Point p1 = {0, 0}; // 初始化点p1为(0, 0) struct Point p2 = {3, 4}; // 初始化点p2为(3, 4) double d = distance(p1, p2); // 计算两点之间的距离并赋值给d printf("The distance between p1 and p2 is: %f ", d); // 输出结果 return 0; }
封装示例:计算两点之间的距离和判断点是否在线段上
为了提高代码的可读性和复用性,可以将计算两点之间的距离和判断点是否在线段上的操作封装成两个函数,定义一个表示线段的结构体:
struct LineSegment { struct Point p1; // 线段的起点 struct Point p2; // 线段的终点 };
定义计算两点之间距离的函数:
double distance(struct Point p1, struct Point p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return sqrt(dx * dx + dy * dy); }
接下来,定义判断点是否在线段上的函数:
int on_segment(struct Point p, struct LineSegment ls) { if (ls.p1.x <= max(ls.p1.x, ls.p2.x) && ls.p1.x <= min(ls.p1.x, ls.p2.x) && ls.p1.y <= max(ls.p1.y, ls.p2.y) && ls.p1.y <= min(ls.p1.y, ls.p2.y)) { // 如果点p的横纵坐标都在线段起点和终点之间(或等于),则点p在线段上,返回1;否则返回0,max和min分别表示求最大值和最小值。