c++--------------------------------接口实现

news2024/12/24 21:07:26
  1. 引用参数

    • 引用的基本概念
      • 在C++中,引用是一个别名,它为已存在的变量提供了另一个名字。引用的声明格式为类型& 引用名 = 变量名;。例如,int num = 10; int& ref = num;,这里ref就是num的引用,对ref的操作等价于对num的操作。引用在定义时必须初始化,并且一旦初始化后,就不能再引用其他变量。
    • 引用作为函数参数的优势
      • 避免复制开销:当函数参数是大型对象(如包含大量数据的结构体或类)时,使用引用参数可以避免对象的复制。例如,假设有一个Person类,包含姓名、年龄、地址等多个成员,如果要将Person对象传递给一个函数来修改它的某些属性,使用引用传递可以避免复制整个Person对象的开销。
      class Person {
      public:
        std::string name;
        int age;
        //...其他成员
      };
      void updatePerson(Person& p) {
        p.age++;
      }
      
      • 直接修改原始数据:引用参数允许函数直接修改调用者提供的原始变量。这在需要在函数内部修改外部变量状态的场景中非常有用。例如,在一个函数中交换两个变量的值:
      void swap(int& a, int& b) {
        int temp = a;
        a = b;
        b = temp;
      }
      
    • 引用参数的注意事项
      • 因为引用参数可以修改原始数据,所以在使用时需要谨慎,确保函数的行为符合预期,不会产生意外的副作用。例如,如果一个函数不应该修改传入的参数,但是却使用了引用参数并且在函数内部修改了它,这可能会导致程序出现错误。
        在这里插入图片描述
  2. 接口与实现

    • 接口的定义和作用
      • 定义:接口是一组函数声明的集合,它规定了一个模块(如类、库等)对外提供的功能和服务。接口就像是一个契约,规定了使用者可以调用哪些函数以及这些函数的参数和返回值类型等信息。例如,一个简单的图形绘制接口可能包括drawCircledrawRectangle等函数声明,使用者可以通过这个接口来绘制不同的图形,而不需要了解这些图形是如何具体绘制的(实现细节)。
      • 作用:接口的主要作用是隐藏实现细节,实现模块之间的低耦合。它使得不同的模块可以独立开发和维护,只要它们遵循相同的接口约定。例如,一个游戏开发团队中,图形渲染模块可以通过接口提供给游戏逻辑模块使用,游戏逻辑模块只需要调用接口中的函数来请求渲染图形,而不必关心图形是如何在屏幕上渲染出来的(这是图形渲染模块的实现细节)。
    • 实现的概念和方式
      • 概念:实现是指对接口中声明的函数进行具体的定义,以实现接口规定的功能。例如,对于前面提到的图形绘制接口,实现部分可能包括如何根据参数在屏幕上绘制圆形、矩形等图形的具体算法和代码。
      • 方式:在C++中,如果接口是以类的形式定义的,那么实现通常是在类的成员函数定义中完成。例如,对于一个Shape接口类(包含纯虚函数),具体的形状类(如CircleRectangle)会继承Shape类并实现其中的纯虚函数:
      class Shape {
      public:
        virtual void draw() = 0;
      };
      class Circle : public Shape {
      public:
        void draw() override {
          // 具体的圆形绘制实现代码
        }
      };
      class Rectangle : public Shape {
      public:
        void draw() override {
          // 具体的矩形绘制实现代码
        }
      };
      
  3. 接口设计原则

    • 单一职责原则(SRP)
      • 含义:一个接口(或类)应该只有一个引起它变化的原因。也就是说,接口应该专注于提供一组紧密相关的功能。例如,一个FileReader接口应该只负责文件读取相关的功能,如openFilereadData等,而不应该包含文件写入或其他不相关的功能。
      • 示例和好处:假设我们有一个UserService接口,它包含registerUser(用户注册)和loginUser(用户登录)功能。按照单一职责原则,这个接口专注于用户认证相关的功能。这样,如果以后需要修改用户注册的逻辑(比如添加新的验证规则)或者用户登录的逻辑(比如支持多因素认证),这些修改不会影响到其他不相关的功能模块,使得代码的维护和扩展更加容易。
    • 接口隔离原则(ISP)
      • 含义:客户端不应该被迫依赖于它不需要的接口。也就是说,应该把大的接口拆分成多个小的、更具体的接口,让客户端只依赖它真正需要的接口。例如,对于一个图形绘制系统,有一个ComplexGraphics接口包含了高级图形绘制功能(如绘制3D图形)和基本图形绘制功能(如绘制圆形、矩形)。对于一个只需要绘制基本图形的客户端应用,应该提供一个BasicGraphics接口,将基本图形绘制功能分离出来,这样客户端就不需要依赖包含高级图形绘制功能的接口。
      • 示例和好处:假设有一个Printer接口,它包含printText(打印文本)、printImage(打印图像)和printBarcode(打印条形码)三个功能。对于一个只需要打印文本的简单文档处理应用,按照接口隔离原则,可以创建一个TextPrinter接口,只包含printText功能。这样,这个应用只需要依赖TextPrinter接口,而不会因为Printer接口的其他功能(如打印图像或条形码的功能可能会频繁更新或出现问题)而受到影响,提高了系统的稳定性和可维护性。
    • 里氏替换原则(LSP)
      • 含义:派生类(子类)对象能够替换其基类(父类)对象,并且程序的功能不受影响。也就是说,在任何使用基类对象的地方,都可以透明地使用派生类对象,并且程序的行为应该符合预期。例如,有一个Vehicle基类,包含move函数,CarBicycleVehicle的派生类。按照里氏替换原则,CarBicyclemove函数的行为应该与Vehiclemove函数的行为在概念上是一致的,只是具体的移动方式(如速度、行驶路线等)可能不同。
      • 示例和好处:假设我们有一个函数void travel(Vehicle* vehicle),它可以接受任何Vehicle类型的对象,并调用其move函数来模拟行驶。如果CarBicycle类正确地遵循里氏替换原则,我们可以在travel函数中传递CarBicycle对象,而函数的行为(如模拟行驶的逻辑)不会出现错误,这样就使得代码具有更好的扩展性和可维护性,可以方便地添加新的交通工具类型(如Motorcycle等派生类)而不需要对travel函数进行大量修改。
        在这里插入图片描述

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

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

相关文章

docker run命令大全

docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…

rk3568制冷项目驱动开发流程汇总(只适用于部分模块CIF DVP等,自用)

采用fpga输入,3568采集并显示至hdmi RKVICAP 驱动框架说明 RKVICAP驱动主要是基于 v4l2 / media 框架实现硬件的配置、中断处理、控制 buffer 轮转,以及控制 subdevice(如 mipi dphy 及 sensor) 的上下电等功能。 对于RK356X 芯片而言, VICAP…

怎么在idea中创建springboot项目

最近想系统学习下springboot,尝试一下全栈路线 从零开始,下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea,选择file->New->Project 2.选择Spring Initializr->设置JDK->…

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大,容错率低&am…

蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程 第一步 创建新项目 第二步 选择型号和管脚封装 第三步 RCC使能 外部时钟,高速外部时钟 第四步晶振时钟配置 由数据手册7.1可知外部晶振频率为24MHz 最后一项设置为80 按下回车他会自动配置时钟 第五步,如果不勾选可能程序只会…

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…

devops和ICCID简介

Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI&#xf…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使,可以说是一坨… 关键词:Apache RocketMQ 5.0 JDK 17 废话少说,开整。 1.版本 官网地址,版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

数据结构:算法篇:快速排序;直接插入排序

目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解: ①从待排序元素中选定一个基准元素; ②以基准元素将数据分为两部分:(可以将:大于基准元素放左,小于基准元素放右) ③对左半部分…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

如何打造用户友好的维护页面:6个创意提升WordPress网站体验

在网站运营中,无论是个人博主还是大型企业网站的管理员,难免会遇到需要维护的情况。无论是服务器迁移、插件更新,还是突发的技术故障,都可能导致网站短暂无法访问。这时,设计维护页面能很好的缓解用户的不满&#xff0…

postman读取文件执行

要从文件获取的变量 text 在pre-request 中写从文件获取数据的脚本。脚本实现了,设置了text默认值,从文件读取text列,将text存入环境变量 //获取text参数 var text "济南天气"; if(data.text){ text data.text } pm.environment.…

37. Three.js案例-绘制部分球体

37. Three.js案例-绘制部分球体 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中的一个渲染器类,用于将3D场景渲染到网页上。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数,可选。 常用…

【Rust自学】4.4. 引用与借用

4.4.0 写在正文之前 这一节的内容其实就相当于C的智能指针移动语义在编译器层面做了一些约束。Rust中引用的写法通过编译器的约束写成了C中最理想、最规范的指针写法。所以学过C的人对这一章肯定会非常熟悉。 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文…

电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?

电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误:原因与解决方案 在日常电脑使用中,我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件,如CorelDRAW(简称CDR)时,可能会遇到“计算…

C# 基本信息介绍

总目录 前言 对 C# 做一个基本信息介绍,让我们对 C# 有个基本的认识。 在进行本文的阅读之前,可以瞧瞧 编程基础知识简述 简单的入个门儿。 一、C# 1. C# 概述 C#是由微软公司发布的一种由C和C衍生出来的面向对象的编程语言。 2. C# 详细介绍 C#&am…

『Linux学习笔记』FRPC 详细介绍及配置解析!

『Linux学习笔记』FRPC 详细介绍及配置解析! 文章目录 一. FRPC 详细介绍及配置解析FRPC 的主要功能FRPC 配置文件解析全局配置代理配置第一个代理服务第二个代理服务 配置文件整体工作流程常见配置项说明FRPC 的使用步骤注意事项结论 二. 参考文献 一. FRPC 详细介…

WPS工具栏灰色怎么办

WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中,轮播图是一种常见的用户界面元素,用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现,详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先,在home.js文件中&a…

JavaEE进阶--mybatis使用测试日志参数传递浏览器访问

文章目录 1.项目创建2.mybatis的使用2.1创建初始页面2.2补充yml文件2.3navicate表2.4用户类的编写2.5查询接口2.6运行测试 3.细节说明3.1java开发规范3.2关于包3.3持久层代码 4.测试文件4.1如何生成4.2生成位置4.3补充方法 5.配置mybatis日志6.参数传递6.1单个参数6.2多个参数 …