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.rhkb.cn/news/183777.html

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

相关文章

[GXYCTF2019]BabySQli1

提示 与平常的sql注入不同这里需要通过php验证账户密码的 错误逻辑 绕过 尝试万能密码 显示是黑客, 这里对or还有和#以及 都测试一下, 看是过滤了哪个 想试试闭合, 结果直接报错弹出来了, 闭合是 这里需要说的是像这种会报错的在真实情况下都是一般不会出现的, 这个是网…

leetcode:26. 删除有序数组中的重复项(python3解法)

难度&#xff1a;简单 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数…

HTML使用canvas绘制海报(网络图片)

生成前&#xff1a; 生成后&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>媒体参会嘉宾邀请函生成链接</title><link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/vant2.10…

大数据毕业设计选题推荐-家具公司运营数据分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Docker:自定义镜像

Docker&#xff1a;自定义镜像 1. 自定义镜像2.实际操作 1. 自定义镜像 我们在通过Dockerfile编写之后&#xff0c;可以通过命令来构建镜像。 2.实际操作 首先&#xff0c;我们将课前资料提供的docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录&#xff1a; Do…

【Unity细节】Json序列化时出现:An item with the same key has already been added. Key:

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

MCU常见通信总线串讲(二)—— RS232和RS485

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

软件测试入门之接口测试

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

超详细!DALL · E 文生图模型实践指南

最近需要用到 DALLE的推断功能&#xff0c;在现有开源代码基础上发现还有几个问题需要注意&#xff0c;谨以此篇博客记录之。 我用的源码主要是 https://github.com/borisdayma/dalle-mini 仓库中的Inference pipeline.ipynb 文件。 运行环境&#xff1a;Ubuntu服务器 ⚠️注意…

MVC、MVP、MVVM区别

MVC、MVP、MVVM区别 MVC&#xff08;Model-View-Controller&#xff09; 。是一种设计模式&#xff0c;通常用于组织与应用程序的数据流。它通常包括三个组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

JWT原理分析——JWT

了解为什么会有JWT的出现&#xff1f; 首先不得不提到一个知识叫做跨域身份验证&#xff0c;JWT的出现就是为了更好的解决这个问题&#xff0c;但是在没有JWT的时候&#xff0c;我们一般怎么做呢&#xff1f;一般使用Cookie和Session&#xff0c;流程大体如下所示&#xff1a;…

基于ssm在线考试系统设计与实现(代码+文档+数据库)

ssm在线考试系统&#xff0c;java在线考试系统&#xff0c;在线考试系统 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;8.x版本都可&#xff09; 硬件环境&#xff1a;Windows 角色&…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署&#xff0c;并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner&#xff0c;并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库&#xff0c;教程中使用的是阿里云的Docker…

腾讯云16核服务器配置有哪些?CPU型号处理器主频性能

腾讯云16核服务器配置大全&#xff0c;CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xff0c;…

后端接口接收对象和文件集合,formdata传递数组对象

0 问题 后端接口需要接收前端传递过来的对象和文件集合&#xff1b;对象中存在数组对象 1 前端和后端 前端只能使用formdata来传递参数&#xff0c;后端不使用RequestBody注解 2 formdata传递数组对象 2.1 多个参数对象数组 addForm: {contactInfo: [{contactPerson: ,…

Apifox日常使用(一键本地联调)

背景说明&#xff1a;现在的项目一般都是前后分离&#xff0c;线上出bug或者在进行联调时&#xff0c;有些时候后端需要重复模拟前端数据格式&#xff0c;在使用Apifox的情况下&#xff0c;如何快速造出后端需要的数据呢&#xff1f; 随便找一个网站&#xff0c;点开f12&#…

FastGPT | 3分钟构建属于自己的AI智能助手

这是一篇使用指南&#xff01;&#xff01;&#xff01; FastGPT是什么&#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&…

Solidity快速入门之函数输出

返回值return和returns Solidity有两个关键字与函数输出相关&#xff1a;return和returns&#xff0c;他们的区别在于&#xff1a; returns加在函数名后面&#xff0c;用于声明返回的变量类型及变量名&#xff1b;return用于函数主体中&#xff0c;返回想要返回的变量&#x…

Java入门篇 之 类与对象

本篇碎碎念&#xff1a;博主作为一个三本学生&#xff0c;庆幸自己上了个本科&#xff0c;但是在支付高昂学费的时候认识到&#xff0c;自己要好好学习&#xff0c;不好好学习&#xff0c;难道以后给人端盘子咩&#xff1b;无论是专科还是本科&#xff0c;都不可以自暴自弃&…

亚马逊云服务器成为了我的首选服务器

背景 作为一名计算机专业的大学生 当完成了自己的前后端项目或者是做出了属于自己的 网址&#xff0c;购买服务器是必不可少的亚马逊云服务器 相比于其他华为云 阿里云 以及腾讯云 等等 有着自己独特的优势 价格原因 学生党最在意的往往还是价格 一个良心亲民的价格 往往可以…