1-2 面向对象编程方法
1.0 面向对象编程思维
在面向对象风格中,结构体被看做数据(data),而操作数据的函数称作方法(method)。目前函数 和数据是分离的,函数并不直接操作数据,我们需要拿到函数返回的结果,再将其赋值给数据。面向对 象风格编程的第一大特性---封装,它希望方法直接操作数据,并且将数据和方法结合在一起,它们构成 一个整体。而这个整体被称作对象。
设置数据函数的命名方法和获取数据函数的命名方法:
一般来说,获取数据的方法会被命名为 getXXX ,设置数据的方法 会被命名为 setXXX
将函数的第一个参数设置为 struct student * ,让函数直接操作 student 结构体。
修改函数名,获取数据的方法命名为 getXXX ,设置数据的方法命名为 setXXX 。
typedef struct STRUCT // 结构体被看做是数据
{int id;char name[20];int gender;int mark;
} Student_t;
在面向对象的编程风格中结构体被看做是数据,结构体中有结构体成员变量

void setStudentId(Student_t *s, int year, int classNum, int serialNum)
{char buffer[20];sprintf(buffer, "%d%d%d", year, classNum, serialNum);int id = atoi(buffer);s->id = id;
}
以下的程序基本将结构体指针,作为一个参数传递进来
const char *getGender(Student_t *s)
{if (s->gender == 0){return "女";}else if (s->gender == 1){return "男";}return "未知";
}
void setGender(Student_t *s, const char *strGender)
{int numGender;if (strcmp("男", strGender) == 0){numGender = 1;}else if (strcmp("女", strGender) == 0){numGender = 0;}else{numGender = -1;}s->gender = numGender;
}
主函数调用:
int main(void)
{Student_t stu;// 参数调用setStudentId(&stu, 2020, 123, 25);strcpy(stu.name, "小明");setGender(&stu, "男");stu.mark = 98;// 打印这些数值printf("学号:%d\n", stu.id);printf("姓名:%s\n", stu.name);// 结构体指针,获取到的是结构体的地址const char *gender = getGender(&stu);printf("性别:%s\n", gender);printf("分数:%d\n", stu.mark);return 0;
}
目前,函数可以直接操作数据了。但是,函数和数据依然是两个独立的部分。我们要将函数和数据结合到一起,这样,这个整体就能被称作对象,函数可以称作属于这个对象的方法
大多数面向对象语言都提供了以下的格式调用一个对象的方法
对象.方法(对象指针,参数1,参数2, 参数3...)
stu.setGender(&stu, "男");
以上代码中,对象为 stu ,方法为 setGender 。通过对象 + 点 + 方法的形式,可以调用属于对 象 stu 的 setGender 方法。在方法的参数中传入性别 男 。这样,方法会把性别 男 转换为整形,并设置 到对象 stu 的数据当中。
在C语言中,若要实现对象 + 点 + 方法的形式,我们可以借助于函数指针
在结构中,声明这3个函数的函数指针:

typedef struct STRUCT // 结构体被看做是数据
{void (*setStudentId)(struct student *s, int year, int classNum, int serialNum);const char *(*getGender)(struct student *s);void (*setGender)(struct student *s, const char *strGender);int id;char name[20];int gender;int mark;
} Student_t;
为了让函数指针有正确的指向,我们需要通过一个 initStudent 函数,为结构体初始化。

void setStudentId(Student_t *s, int year, int classNum, int serialNum)
{char buffer[20];sprintf(buffer, "%d%d%d", year, classNum, serialNum);int id = atoi(buffer);s->id = id;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>typedef struct STRUCT // 结构体被看做是数据
{int id;char name[20];int gender;int mark;void (*setStudentId)(struct STRUCT* s, int year, int classNum, int serialNum);const char* (*getGender)(struct STRUCT* s);void (*setGender)(struct STRUCT* s, const char* strGender);
} Student_t;void setStudentId(Student_t* s, int year, int classNum, int serialNum)
{char buffer[20];sprintf(buffer, "%d%d%d", year, classNum, serialNum);int id = atoi(buffer);s->id = id;
}const char* getGender(Student_t* s)
{if (s->gender == 0){return "女";}else if (s->gender == 1){return "男";}return "未知";
}void setGender(Student_t* s, const char* strGender)
{int numGender;if (strcmp("男", strGender) == 0){numGender = 1;}else if (strcmp("女", strGender) == 0){numGender = 0;}else{numGender = -1;}s->gender = numGender;
}void InitStudent(Student_t* s)
{s->setStudentId = setStudentId;s->getGender = getGender;s->setGender = setGender;
}int main(void)
{#if 0Student_t stu;// 参数调用setStudentId(&stu, 2020, 123, 25);strcpy(stu.name, "小明");setGender(&stu, "男");stu.mark = 98;// 打印这些数值printf("学号:%d\n", stu.id);printf("姓名:%s\n", stu.name);// 结构体指针,获取到的是结构体的地址const char* gender = getGender(&stu);printf("性别:%s\n", gender);printf("分数:%d\n", stu.mark);return 0;
#elseStudent_t stu;InitStudent(&stu);stu.setStudentId(&stu, 2022, 123, 26);strcpy(stu.name, "小明");stu.setGender(&stu, "男");stu.mark = 98;printf("学号:%d\n", stu.id);printf("姓名:%s\n", stu.name);const char* gender = stu.getGender(&stu);printf("性别:%s\n", gender);printf("分数:%d\n", stu.mark);return 0;
#endif}
运行以上程序输出如下结果:

相关文章:
1-2 面向对象编程方法
1.0 面向对象编程思维 在面向对象风格中,结构体被看做数据(data),而操作数据的函数称作方法(method)。目前函数 和数据是分离的,函数并不直接操作数据,我们需要拿到函数返回的结果&a…...
k8s中部署nginx的pod
在当今数字化的浪潮中,容器编排技术成为了构建和管理应用程序的核心力量。Kubernetes(简称 k8s)作为容器编排领域的佼佼者,凭借其强大的自动化部署、扩展和管理能力,深受开发者和运维人员的青睐。而 Nginx 作为一款高性…...
CSS 组合选择符详解与实战示例
在 Web 开发过程中,CSS 用于定义页面元素的样式,而选择器则帮助我们精确定位需要添加样式的元素。今天我们主要来讲解 CSS 中的组合选择符,它们能够根据 DOM 结构中元素之间的关系来选中目标元素,从而写出结构清晰、易于维护的 CS…...
html为<td>添加标注文本
样式说明: /*为td添加相对定位点*/ .td_text {position: relative; }/*为p添加绝对坐标(相对于父元素中的定位点)*/ .td_text p {position: absolute;top: 80%;font-size: 8px; }参考资料:...
apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片
概述 业务中经常会遇到在单元格内填充图片的需求,而且要求指定图片在单元格内的位置。 一般都是用的apache的poi,设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…...
无界构建微前端?NO!NO!NO!多系统融合思路!
文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…...
数据留痕的方法
在项目中,数据变更时,经常需要记录上次的数据,以便查看对比,专业术语叫做数据留痕。数据变更留痕(即记录数据的变更历史)是一个常见的需求,例如在审计、追踪数据变化或满足合规性要求的场景中。…...
Glustefs 服务端配置流程
Glustefs 服务端配置流程 (一)环境搭建 名称ip硬件设备文件虚拟机 gluster1192.168.101.12G新磁盘/dev/sdb虚拟机 gluster2192.168.101.22G新磁盘/dev/sdb虚拟机 gluster3192.168.101.32G新磁盘/dev/sdb (二)磁盘格式化&#x…...
为飞牛OS基于FRP的内网穿透开启HTTPS加密
前言 玩NAS的朋友应该有比较多只是在家庭局域网使用,比如日常看看电影、备份手机照片什么的,这属于家庭局域网的使用场景。 当然了,如果你经常出差,或者过年回家不想把NAS也背回去,或者是想上班摸鱼,或者是…...
《基于Python与DashScope的智能语音合成工具开发》
《基于Python与DashScope的智能语音合成工具开发》 在当今数字化时代,语音合成技术已经广泛应用于各种场景,如智能语音助手、有声读物、导航系统等。本文将介绍如何使用Python和DashScope平台开发一个简单而功能强大的文字转语音工具。通过这个工具&…...
快速上手Vim的使用
Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式(ctrlV进入) Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑,甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...
vue学习第四天 v-on事件绑定
v-on绑定事件如下,点击按钮会弹出alert v-on:事件具体名称“事件调用的函数名” 事件调用的函数写在methods里面 在methods属性的函数里,可以用this获取data的数据,this代表的就是整个vue实例 用this.age就可以拿到age࿰…...
2.8寒假作业
web:[HNCTF 2022 Week1]2048 之前也做过类似的题目,之前的解法是直接get传参score20000,可以尝试 打开环境看源代码,直接改源代码显然是不行的,那么用一下上面的办法也不行,估计是要改其他方向的ÿ…...
PyTorch torch.sign函数介绍
torch.sign 是 PyTorch 库中用于计算输入张量每个元素符号的函数。下面从功能概述、函数原型、参数解释、返回值、使用示例以及与相关函数对比等方面详细介绍 torch.sign。 功能概述 torch.sign 函数会返回一个与输入张量形状相同的新张量,其中每个元素的值表示输…...
Formality:时序变换(五)(寄存器复制)
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生,它们包括:时钟门控(Clock Gating)、寄存器合并(Register Merging)、…...
音频知识基础
音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受; 主要和声波的振幅相关,同时也和频率有一定关系; 音调 音调是人耳对声音高低的主观感受; 主要与频率相关&#…...
科技赋能数字内容体验的核心技术探索
内容概要 在数字化时代,科技的迅猛发展为我们的生活和工作带来了深刻的变革。数字内容体验已经成为人们获取信息和娱乐的重要途径,而这背后的技术支持则扮演着至关重要的角色。尤其是在人工智能、虚拟现实和区块链等新兴技术的推动下,数字内…...
DeepSeek-R1 本地大模型搭建对接API
DeepSeek-R1 在这里将学到很多知识 欢迎使用使用DeepSeek-R1本地大模型DeepSeek 的模型基础说明DeepSeek的本地 API 说明DeepSeek 本地模型搭建1、执行命令安装及测试 DeepSeek-R1 API接口调用当然,我们为了让用户更加便捷,我们把API 接口全部放到上面截…...
利用NestJS构建高效的RESTful API接口
1. 引言 项目背景与目标 随着互联网应用的快速发展,RESTful API已成为前后端分离架构中的重要组成部分。本文将介绍如何使用NestJS构建一个高效且可维护的RESTful API接口。目标是通过NestJS的模块化和依赖注入特性,实现一个易于扩展和维护的API系统。 RESTful API的重要性…...
redis高级数据结构布隆过滤器
文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻…...
《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》
一、wiki.js 知识库简介 基本概述 定义 :Wiki.js 是一个开源、现代、轻量且功能强大的 Wiki 应用程序,基于 Node.js 构建,旨在帮助个人和团队轻松创建、管理和共享知识。开源性质 :它遵循 AGPLv3 许可证,任何人都可以…...
CSS Overflow 属性详解:控制内容溢出的利器
在前端开发中,处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性,帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性? overflow 属性用于控制当元素的内容…...
.yml文件_YAML格式文件
.yml 文件是 YAML(YAML Ain’t Markup Language)格式的一种文件扩展名。YAML 是一种用于数据序列化的语言,通常用于配置文件、数据交换、日志记录等场景。它以可读性高、简洁的格式为特点,非常适合用于人类阅读和编写。YAML 通常被…...
根文件系统 Debian10【1】移植
1.开发背景 一般根文件系统使用 Busybox 或者是 Buildroot 构建,这样构建出来的文件系统比较小,但是不具备上网功能,扩展性比较差。随着 ARM 的日益强大,ARM 可以搭载更庞大复杂的系统,可以是 Ubuntu 或者 Debian 等发…...
【PyQt】实现格式刷功能
实现格式刷功能 在Qt Designer中直接实现格式刷功能并不支持,但可以通过以下方法在应用程序中实现类似功能: 一、Qt Designer中的替代方案 1.手动设置样式表 在属性编辑器中复制样式表(QSS)内容,粘贴到其他控件。 …...
Could not create task ‘:mainActivity:minifyReleaseWithR8‘.
最近接收了一个老项目,把项目clone下来后,总是报错,无法运行 Build-tool 33.0.1 is missing DX at D:\Android\Sdk\build-tools\33.0.1\dx.batFAILURE: Build failed with an exception.* What went wrong: Could not determine the depende…...
2025年日祭
本文将同步发表于洛谷(暂无法访问)、CSDN 与 Github 个人博客(暂未发布) 本蒟自2025.2.8开始半停课。 任务计划(站外题与专题) 数了一下,通过人数比较高的题,也就是我准备补的题&a…...
二维dp-地图
问题描述 传说,在蓝桥王国中一个极其神秘的森林。这个森林的起点在(1,1) ,终点在 (n,m)。在你进入这个森岭后,每次你只可以向下或者向右走,由于森岭的神秘力量,至多只可以改变 k 次方向。 小蓝现在想知道,…...
Windows下AMD显卡在本地运行大语言模型(deepseek-r1)
Windows下AMD显卡在本地运行大语言模型 本人电脑配置第一步先在官网确认自己的 AMD 显卡是否支持 ROCm下载Ollama安装程序模型下载位置更改下载 ROCmLibs先确认自己显卡的gfx型号下载解压 替换替换rocblas.dll替换library文件夹下的所有 重启Ollama下载模型运行效果 本人电脑配…...
el-table表格点击单元格实现编辑
使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中,使用 div 显示文本内容,单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData,tabClickIndex: null,tabClickLabel: ,用于判断是否…...
