c面向对象编码风格(上)

面向对象和面向过程的基本概念

面向对象和面向过程是两种不同的编程范式,它们在软件开发中用于组织和设计代码的方式。

面向过程编程(Procedural Programming)是一种以过程(函数、方法)为核心的编程方式。在面向过程编程中,程序被划分为一系列的过程或函数,这些过程按照顺序逐步执行,每个过程都可以接受输入参数并返回输出结果。数据在过程中被操作,通过参数进行传递。面向过程编程关注的是解决问题的步骤和算法,通过将问题拆分为一系列的步骤来解决。

面向对象编程(Object-Oriented Programming,OOP)是一种以对象为核心的编程方式。在面向对象编程中,程序被组织成一系列的对象,每个对象都有自己的属性(数据)和行为(方法)。对象之间通过消息传递来进行通信和交互,对象可以通过继承、封装和多态等特性进行关联和扩展。面向对象编程关注的是将现实世界中的事物抽象成对象,通过对象之间的交互来解决问题。

面向过程和面向对象的主要区别如下:

  1. 抽象程度:面向过程编程更加关注解决问题的具体步骤和算法,将问题分解为一系列的过程。而面向对象编程更加关注问题的抽象,将问题抽象成对象及其相互关系。
  2. 数据和行为:在面向过程编程中,数据和行为是分离的,函数对数据进行操作。而在面向对象编程中,数据和行为紧密结合,对象包含了数据和对数据进行操作的方法。
  3. 封装和隐藏:面向对象编程通过封装将数据和相关方法组合在一起,隐藏了内部实现细节,提供了更好的模块化和抽象性。而面向过程编程没有明确的封装机制,数据和方法之间的关联性较弱。
  4. 继承和多态:面向对象编程通过继承和多态实现代码的重用和扩展,可以创建基于现有类的新类,并对方法进行覆盖或重写。而面向过程编程没有明确的继承和多态特性。

当我们具体分析面向过程和面向对象编程时,可以从以下几个方面进行比较:

  1. 效率:面向过程编程的执行效率通常比面向对象编程高,因为它直接按照步骤执行,没有额外的对象和方法调用开销。而面向对象编程需要创建对象和调用方法,会增加执行的开销。
  2. 可维护性:面向对象编程相较于面向过程编程具有更好的可维护性。面向对象编程利用封装、继承和多态等特性,能够更好地组织和管理代码,降低了代码的耦合性。这样在修改和扩展代码时更容易定位和处理,也减少了对现有代码的影响。
  3. 可复用性:面向对象编程具有更好的可复用性。通过继承和多态等特性,可以基于现有类创建新的类并重用已有的方法和属性。这样可以减少重复编写代码的工作量,提高代码的复用性和可维护性。
  4. 抽象性和扩展性:面向对象编程更加注重对问题的抽象和建模,能够更好地反映现实世界中事物之间的关系。通过类、对象和继承等特性,可以更容易地扩展和修改系统的功能。而面向过程编程则更加关注具体的算法和步骤,对于问题的抽象和扩展性较弱。

一下的代码是使用面向过程的思维进行编写的

#include <easyx.h>
#include <stdio.h>
#include <math.h>
/*面向过程和面向对象question1: 面向过程 1: 将问题的解法分解成若干步骤 2: 使用函数分别实现这些步骤 3: 依次调用这些函数 question2:  面向对象 1: 面向对象的编程逻辑使用c语言实现面向对象的过程面向对象编程风格的三大特性 1: 封装 2: 继承 3: 多态
*/// 创建学生类型的结构体
struct student {int id;char name[20];int gender;int mark;};// 学生的学号
int makeStudentId(int year, int classNum, int serialNum) {char buffer[20];// sprintf的作用是字符拼接,将结构传入第一个参数buffer指示的字符当中sprintf(buffer, "%d%d%d", year, classNum, serialNum);// 函数atoi将指示的字符串转换为整型并返回结果int id = atoi(buffer);return id;
}
// 定义性别的结构体0表示为女生, 1 表示为男生,定义两个函数对性别进行处理将整型表示的性别转换为字符串表示的性别
const char* numGenderToStrGender(int numGender) {if (numGender == 0) {return "女";}else if (numGender == 1) {return "男";}return "佚名";
}
// 将字符串表示的性别转换为整型表示的性别进行处理
int strGenderToNumGender(const char* strGender) {int numGender;if (strcmp("男", strGender) == 0) {numGender = 1;}else if (strcmp("女", strGender) == 0) {numGender = 0;}else {numGender = -1;}return numGender;
}int main(){// 结构体的声明struct student stu;// 给id赋值stu.id = makeStudentId(2022, 607, 12);// 给name赋值strcpy(stu.name, "小明");// 给gender赋值stu.gender = strGenderToNumGender("男");// 直接给mark赋值stu.mark = 98;// 使用printf打印输出相关数据,采用点的方式对函数进行调用printf("学号:%d\n", stu.id);printf("姓名:%d\n", stu.name);// 将数字1和0转换为字符串男和女const char* gender = numGenderToStrGender(stu.gender);printf("性别%d\n", gender);printf("分数%d\n", stu.mark);return 0;}

面向对象代码的编写方式

#define _CRT_SECURE_NO_WARNINGS
#include <easyx.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
// 编写函数指针
struct student {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;};// 学生的学号
void setStudentId(struct student *s,int year, int classNum, int serialNum) {char buffer[20];// sprintf的作用是字符拼接,将结构传入第一个参数buffer指示的字符当中sprintf(buffer, "%d%d%d", year, classNum, serialNum);// 函数atoi将指示的字符串转换为整型并返回结果int id = atoi(buffer);// 使用面向对象的方式直接给结构体中的成员id赋值s->id = id;
}const char* getGender(struct student *s) {if (s->gender == 0) {return "女";}else if (s -> gender == 1) {return "男";}return "佚名";}
// 将字符串表示的性别转换为整型表示的性别进行处理
void setGender(struct student* 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(struct student* s)
{s->setStudentId = setStudentId;s->getGender = getGender;s->setGender = setGender;
}
int main(){// 结构体的声明struct student stu;// 函数体在使用过程中需要调用initStudent函数设置正确的指向initStudent(&stu);// 直接调用函数传入结构体指针setStudentId(&stu, 2023, 607, 12);strcpy(stu.name, "小明");setGender(&stu, "男");stu.mark = 98;// 使用printf打印输出相关数据,采用点的方式对函数进行调用printf("学号:%d\n", stu.id);printf("姓名:%s\n", stu.name);// 将数字1和0转换为字符串男和女const char* gender = stu.getGender(&stu);printf("性别%s\n", gender);printf("分数%d\n", stu.mark);return 0;}

在这里插入图片描述面向对象继承方面的代码

#define _CRT_SECURE_NO_WARNINGS
#include <easyx.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
// 编写函数指针// 继承
struct person {int id;char name[20];int gender;const char* (*getGender)(struct person* s);void (*setGender)(struct person* s, const char* strGender);
};
struct teacher {struct person super;char subject[20];};
struct student {struct person super;int mark;void (*setStudentId)(struct student* s, int year, int classNum, int serialNum);};// 学生的学号
void setStudentId(struct student *s,int year, int classNum, int serialNum) {char buffer[20];// sprintf的作用是字符拼接,将结构传入第一个参数buffer指示的字符当中sprintf(buffer, "%d%d%d", year, classNum, serialNum);// 函数atoi将指示的字符串转换为整型并返回结果int id = atoi(buffer);// 使用面向对象的方式直接给结构体中的成员id赋值s->super.id = id;
}const char* getGender(struct person *s) {if (s->gender == 0) {return "女";}else if (s -> gender == 1) {return "男";}return "佚名";}
// 将字符串表示的性别转换为整型表示的性别进行处理
void setGender(struct person* 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 initPerson(struct person* p) {p->getGender = getGender;p->setGender = setGender;
}
// 初始化函数
void initStudent(struct student* s) {initPerson(&(s->super));s->setStudentId = setStudentId;
}
// 初始化函数
void initTeacher(struct teacher* t) {initPerson(&(t->super));
}int main(){// 结构体的声明struct student stu;// 函数体在使用过程中需要调用initStudent函数设置正确的指向initStudent(&stu);// 直接调用函数传入结构体指针setStudentId(&stu, 2023, 607, 12);strcpy(stu.super.name, "小明");stu.super.setGender(&stu.super, "男");stu.mark = 98;// 使用printf打印输出相关数据,采用点的方式对函数进行调用printf("学号:%d\n", stu.super.id);printf("姓名:%s\n", stu.super.name);// 将数字1和0转换为字符串男和女const char* gender = stu.super.getGender(&stu.super);printf("性别%s\n", gender);printf("分数%d\n", stu.mark);putchar('\n');struct teacher t;//  初始化teacherinitTeacher(&t);t.super.id = 12345;strcpy(t.super.name, "林老师");t.super.setGender(&t.super, "男");strcpy(t.subject, "C语言");//  打印这些数值printf("学号:%d\n", t.super.id);printf("姓名:%s\n", t.super.name);gender = t.super.getGender(&t.super);printf("性别:%s\n", gender);printf("科目:%s\n", t.subject);return 0;}

在这里插入图片描述
面向对象之多态

#include <easyx.h>
#include <stdio.h>struct Shape {void (*draw)(struct Shape*);
};struct Rect {struct Shape super;int left;int top;int right;int bottom;
};struct Circle {struct Shape super;int x;int y;int r;
};struct Triangle {struct Shape super;POINT p1;POINT p2;POINT p3;
};void drawRect(struct Rect* r)
{rectangle(r->left, r->top, r->right, r->bottom);
}void drawCircle(struct Circle* c)
{circle(c->x, c->y, c->r);
}void drawTriangle(struct Triangle* t)
{line(t->p1.x, t->p1.y, t->p2.x, t->p2.y);line(t->p2.x, t->p2.y, t->p3.x, t->p3.y);line(t->p3.x, t->p3.y, t->p1.x, t->p1.y);
}void initRect(struct Rect* r)
{r->super.draw = (void (*)(struct Shape*))drawRect;
}void initCircle(struct Circle* c)
{c->super.draw = (void (*)(struct Shape*))drawCircle;
}void initTriangle(struct Triangle* t)
{t->super.draw = (void (*)(struct Shape*))drawTriangle;
}int main()
{initgraph(800, 600);setaspectratio(1, -1);setorigin(400, 300);setbkcolor(WHITE);setlinecolor(BLACK);cleardevice();struct Rect r = { {}, -200, 200, 200, 0 };struct Circle c = { {}, 0, 0, 100 };struct Triangle t = { {},  {0, 200}, {-200, 0}, {200, 0} };initRect(&r);initCircle(&c);initTriangle(&t);struct Shape* arrShape[3] = {(struct Shape*)&r, (struct Shape*)&c, (struct Shape*)&t };for (int i = 0; i < 3; i++){arrShape[i]->draw(arrShape[i]);}getchar();closegraph();return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言查看各数据类型所占大小

编译器&#xff1a;VC2010 #include<stdio.h> int main() {printf("%d\n",sizeof(char));printf("%d\n",sizeof(short));printf("%d\n",sizeof(int));printf("%d\n",sizeof(long));printf("%d\n",sizeof(long long))…

【sql注入】sql关卡1~4

前言&#xff1a; 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…

最新 vie-vite框架下 jtopo安装使用

官方地址 官方源码 安装下载 1.官方好像都没有给git地址&#xff0c;尝试npm安装报错 2.找到1.0.5之前的版本npm i jtopo2&#xff0c;安装成功后使用报错&#xff0c;应该是版本冲突了 1.本地引入&#xff0c; 点击官方源码下载&#xff0c;需要jtopo_npm文件 2.引入到本…

Jetpack:030-Jetpack中的状态

文章目录 1. 概念介绍2. 使用方法2.1 可监听对象2.2 获取状态值2.3 修改状态值2.4 重组函数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中网格布局相关的内容&#xff0c;本章回中主要 介绍状态。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff0…

【SpringCloud Alibaba -- Nacos】Linux 搭建 Nacos 集群

搭建 Nacos 集群 架构 centos安装docker https://docs.docker.com/engine/install/centos/ 详细配置过程 MySql8 mysql数据库配置 数据库脚本 nacos/conf/nacos-mysql.sql Nacos2 application.properties 修改为mysql spring.datasource.platformmysqldb.num1 db.url…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求&#xff1a; 1&#xff09;被要求统计代码行数&#xff1b; 2&#xff09;不想打开Linux&#xff0c;懒得下载Windows版本GitStats&#xff1b; 3&#xff09;打开了Linux但也不记得find命令行怎么用&#xff1b; 4&#xff09;打开了Linux&#xff0c;装好了Gitstats但自…

wagtail的使用

文章目录 安装虚拟环境新建项目时指定虚拟环境打开已有项目添加虚拟环境 安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 管理工作台内容扩展首页的数据模型更新数据库修改模板页创建一个页面的过程 models中的基本字段templates字符型文本字段富…

汽车标定技术(四)--问题分析:多周期测量时上位机显示异常

目录 1.问题现象 2.数据流分析 ​​​​3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时&#xff0c; DAQ的实现是一大头痛的事情。最初单周期实现还好一点&#xff0c;特别是…

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

系列文章目录 文章目录 系列文章目录前言一、设置 Gazebo 仿真环境二、在 Gazebo 中模拟和控制机器人2.1 概述2.2 任务调度器2.3 感知和目标生成系统2.4 运动规划2.5 机械臂和关节控制系统 三、分配用于控制机器人的参数3.1 定义机器人模型和运动规划参数&#xff0c;3.2 定义机…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承&#xff0c;这与现实生活中的继承意思差不…

[直播自学]-[汇川easy320]搞起来(1)给PLC供电

从没正儿八经的用一用PLC&#xff0c;所以双11在淘宝入手一个EASY320&#xff0c;大概1000出头。 到货后&#xff0c;汇川官网搜了一下资料&#xff0c;搜到这几个&#xff1a; 首先是给PLC供电吧&#xff0c;看了下PLC前面是24V&#xff0c;不知道供电范围多宽&#xff0c;于…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…

https原理

首先说一下几个概念&#xff1a;对称加密、非对称加密 对称加密&#xff1a; 客户端和服务端使用同一个秘钥&#xff0c;分两种情况&#xff1a; 1、所有的客户端和服务端使用同一个秘钥&#xff0c;这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

ffmpeg命令帮助文档

一&#xff1a;帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式&#xff1a;ffmpeg [options] [[infile options] -i infile] [[outfile options] outfile] 二&#xff1a;将帮助文档输出到文件 …

部署ELK

一、elasticsearch #拉取镜像 docker pull elasticsearch:7.12.1 #创建ELK docker网络 docker network create elk #启动ELK docker run -d --name es --net elk -P -e "discovery.typesingle-node" elasticsearch:7.12.1 #拷贝配置文件 docker cp es:/usr/share/el…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A&#xff1a;基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像&#xff08;通常是地表坑洼图像&#xff09;识别出存在坑洼的道路。这…

Pycharm 对容器中的 Python 程序断点远程调试

pycharm如何连接远程服务器的docker容器有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 本文是第一种方法的教程&#xff0c;第二种请点击以上的链接…

个人服务器到期,项目下线,新的开始

告别旧服务器 2023.11.06服务器到期&#xff0c;所有项目正式下线 时间真的过的很快&#xff0c;从开始踏入编程的大门&#xff0c;到现在不知不觉已经陆续经手了两台服务器了&#xff0c;目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿&#xff0c;该服务器上目前运行的项…