当前位置: 首页 > news >正文

self与方法


title: self与方法
date: 2024-09-14 20:50:08
description: c语言实现self
tags:

  • c language

skaiuijing

有过面向对象语言学习经历的小伙伴们在使用c语言的过程中,往往会羡慕这些面向对象语言的特性。

其实c语言能够模拟这些高级语言的特性。

例如,在c++中,this指针是一个非常方便的指针,但是在c语言也可以模拟做到:

#include <stdio.h>
#include <string.h>typedef struct {char name[50];int age;void (*setName)(struct Person* self, const char* name);void (*setAge)(struct Person* self, int age);void (*printInfo)(struct Person* self);
} Person;void setName(Person* self, const char* name) {strncpy(self->name, name, sizeof(self->name));
}void setAge(Person* self, int age) {self->age = age;
}void printInfo(Person* self) {printf("Name: %s\n", self->name);printf("Age: %d\n", self->age);
}void createPerson(Person* p) {p->setName = setName;p->setAge = setAge;p->printInfo = printInfo;
}int main() {Person person;createPerson(&person); person.setName(&person, "liming");person.setAge(&person, 25);person.printInfo(&person);return 0;
}

通过函数指针和self指针的定义和传递,我们模拟了类和方法的实现。也就是说,在c语言中,我们也可以非常方便的实现增删查改。

createPerson函数成功初始化了数据结构中的方法,将函数的地址赋值给数据结构中的函数指针,使其成为了该结构体的方法。

void createPerson(Person* p) {p->setName = setName;p->setAge = setAge;p->printInfo = printInfo;
}

可能有小伙伴很疑惑:这样做到底有什么好处?我们也可以直接在main函数对person进行操作啊?

首先我们要明白: 程序 = 数据结构 + 算法

数据结构是程序中非常重要的一部分,它往往存储重要的数据,并且作用于各个文件,但是对数据结构的初始化、赋值等操作,在函数出现多重嵌套时,代码容易出现可读性变差等问题,这个时候,穿梭在各个函数及文件中的self指针,无时无刻不在提醒着我们数据结构的存在及重要性。

self的存在,就是在绑定数据结构和方法,将特定的操作与数据结构绑定起来

通过定义self指针,我们可以非常方便的设置数据结构的各个成员,完成初始化等操作,我们不必在main函数中直接对数据结构的成员进行赋值,而是把这一切都放在函数中进行,当函数的嵌套非常深时,程序的可读性变得乱七八糟时,self的重要性就能体现出来了。

其实c语言的文件就是一个弱类,我们可以充分学习面向对象的思想对程序进行模块化、对象化处理,然后在编写c语言时充分利用文件作用域和函数的命名以及函数指针来实现类和方法。


http://www.mrgr.cn/news/27059.html

相关文章:

  • PD虚拟机占用多少内存?使用电脑的虚拟内存会损害电脑吗
  • linux 操作系统下cupsdisable命令介绍和使用案例
  • AtCoder ABC367 A-D题解
  • 建筑机器人通用操作系统设计方案
  • xshell密钥方式连接阿里云Linux
  • PCM的缺点
  • python基础知识 (五)--容器、索引、切片、字符串的遍历、查找、修改元素
  • Redis实现发布/订阅功能(实战篇)
  • 高级java每日一道面试题-2024年9月11日-数据库篇-事务回滚的常见原因有哪些?
  • 基于 WeChatFerry 的 Python 机器人框架WeChatRobot
  • iOS中的链表 - 单向链表
  • 更换cuda版本
  • GIS可视化软件:地理信息与遥感领域中的洞察之眼
  • 云曦2024秋季开学考
  • Linux | 探索 Linux 信号机制:信号的产生和自定义捕捉
  • 拒绝千篇一律,AI帮你定制独一无二的个人写真
  • JavaScript --函数作用域变量的使用规则(局部和访问)
  • Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?
  • 大数据热门技术
  • 算法基础-快速幂