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

标准C++day2——函数重载、默认形参和引用

一、函数重载

    1、什么是函数重载?

    在同一作用域下,函数名相同,参数列表不同的函数构成重载关系

    函数重载与返回值类型、参数名无关

    与作用域是否相同,以及参数列表的数量、参数类型、常属性不同等有关

    2、C++是如何实现函数重载的?

    通过g++ -S 生成汇编代码可知,编译器会把函数的参数类型进行缩写后追加到函数名的末尾形成新的函数名,既是进行了换名操作,从而确保编译结果函数名不重复

    3、extern "C" 

    因为通过C++编译器编译函数、调用语句时,会变成换名后的名字,但是项目中有可能需要去调用已经通过C编译器编译好的函数,它们是没有换名的,因此会调用失败

    因为大部分情况下C编译好的文件无法重新使用C++编译器编译,所以只能想办法让C++编译器在调用C编译的函数时不要换名

    通过 extern "C"{xxx} 让C++编译器按照C语言的格式编译函数,从而让调用语句与被调用函数名同名,这样就可以正确地调用C标准库、系统函数

    4、重载和隐藏

    在同一作用域下,函数名相同,参数列表不同的函数构成重载关系

    在不同作用域下,同名函数构成了隐藏

    5、参数类型不匹配

    当调用函数时,编译器会优先调用类型最匹配最精确的版本函数,如果没有最正确的,则会先做类型转换后再匹配,但如果没有能够进行类型转换匹配的版本最后也会报错

    但是不建议通过类型转换去调用函数,因为转换情况与编译器有关

二、默认形参

    1、什么是默认形参

    在C++中可以给函数的参数设置默认值,当函数被调用时如果调用者提供了实参则使用实参调用,如果没有提供则使用默认值调用

    2、默认形参要靠右

    如果函数有多个参数,并设置了默认形参,要遵循从右往左依次设置默认形参

    3、只能在函数声明中设置默认形参

    如何函数声明与定义分开实现,只能在函数声明中设置默认形参,否则语法错误

    4、默认形参可能会影响函数重载

    如果对函数进行了重载,又设置了默认形参,调用时可能会有冲突和歧义,调用失败

    因此对于重载过的函数设置默认形参时一定要谨慎

三、内联函数

    1、普通函数

    普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回

    2、什么是内联函数

    内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内联函数的二进制指令进行替换,就没有跳转和返回,而是直接执行二进制指令,这种函数称为内联函数

    3、显式内联和隐式内联

        显式内联:

        在函数的返回值前加 inline 该函数就以内联函数的机制调用

        隐式内联:

        在结构、联合、类中的成员函数会自动被当做内联函数处理

            注意:如果在结构、联合、类中声明成员函数,但是在外面定义,则不会当做内联函数处理

       

        注意:函数是否被内联由编译器以及它的优化等级决定,加 inline 只是有可能影响它的决定

        注意:g++默认优化等级 -O -O1 下所有的内联函数都会当成普通函数处理

            在-O2 -O3的优化级别下,甚至普通函数都可能会被当做内联函数处理

        注意: c99 也支持 inline

   

    4、内联的适用条件

        优点:节约了函数传参、跳转、返回的时间,提高代码的运行速度

        缺点:当被多个位置调用时,那么二进制指令会被拷贝多份,产生了冗余,导致可执行文件明显增加

        适用条件:

        1、适合内容简单且同一位置频繁调用的函数

        2、不适合内容多、且多个位置、较少调用的函数,因为节约的时间还弥补不过牺牲的空间

        3、带有递归属性的函数无法内联,编译器会自动忽略

    5、内联函数和宏函数的相同点和不同点

        相同点:都是采用以空间换时间的策略提高程序的运行速度,减少函数调用跳转的耗时

        不相同:

        1、宏函数不是真正的函数,只是语句替换,不会对参数进行类型检查、没有返回值、安全性低

        2、内联函数是真正的函数、严格检查参数类型、有返回值、安全性高

四、引用

    什么是引用:引用就是一种取别名的机制

    为什么要使用指针:

    1、跨函数共享变量(输出型参数),引用可替代  //06

    2、提高传参效率,引用可替代,效率比指针还高,不拷贝字节

    3、配合堆内存使用,只能使用指针

    4、配合字符串使用,string类可以替代

    引用使用格式:

        类型名& 别名 = 数据;    //类型名& 别名=变量名; 数据是常量 所以要加const保护

    什么情况下使用引用:

        1、跨函数共享变量,引用比指针更安全(无需直接操作地址空间、不存在空引用,也极少出现野引用问题)、也比指针更方便(无需缺地址、解引用)

        2、提高传参效率,引用的效率比指针还高,指针最起码还要传递4/8字节的地址编号,但是引用一个字节都不需要传递,但是引用和指针一样都有被修改的风险,因此为了保护目标需要增加const

   

    使用引用需要注意的问题:

        1、引用必须初始化,所以不存在空的引用

        2、可以引用右值,但是必须使用const修饰引用

        3、引用不能中途更改引用的目标

        4、函数的返回值类型可以是引用类型,但不能返回局部变量的引用

   

    指针与引用的相同点和不同点?

    相同点:

        1、都可以跨函数共享内存,都可以提高函数传参效率、也需要const保护

        2、可以定义数组指针,也可以定义数组引用

            int arr[5] = {1,2,3,4,5};

            int (*arrp)[5] = &arr;

            int (&hehe)[5] = arr;

        3、可以定义函数指针,可以定义函数引用

            void (*fp)(void) = func;

            fp();

            void (&xixi)(void) = func;

            xixi();

    不同点:

        1、引用是一种取别名的机制,指针是一种数据类型

        2、引用不需要额外存储空间,指针需要4/8字节用于存储内存地址

        3、指针可以不初始化,引用必须初始化

        4、指针有空指针,但没有空引用

        5、指针可以更改指向的目标,但引用不可以

        6、指针可以配合堆内存使用,而引用不行

        7、可以定义指针数组,但不能定义引用数组

五、C++的强制类型转换

    C语言原来的强制类型转换依然可以在C++中继续使用

        (新类型)数据

    注意:强制类型转换都只是得到一个临时结果,数据原来的类型不会改变

    为什么C++要重新设计强制类型转换?

        因为C语言的强制类型转换虽然自由度高,但是非常危险,没有任何要求限制

    为什么C++之父设计强制类型转换设计得很复杂、使用很麻烦?

        因为他认为只有在程序设计不合理的情况下才需要强制类型转换,之所以设计复杂就是不想让程序员使用,而是去反思、重新设计自己的代码

    1、静态类型转换

    static_cast<目标类型>(原数据)

    目标类型和原数据类型之间必须有一个方向能够自动类型转换,否则出错        //比如int和int*之间就不能

    2、动态类型转换

    dynamic_cast<目标类型>(原数据)

    目标类型和原数据类型之间必须存在继承关系,并且目标类型必须是指针类型或引用类型,否则出现错误

    3、去常类型转换

    const_cast<目标类型>(原数据)

    目标类型必须是指针或引用,且除了const属性不同,其它都要相同,否则出现报错

    4、重解释类型转换

    reinterpret_cast<目标类型>(原数据)

    只能把整数转成指针,或者把指针转成整数,否则会出错

相关文章:

标准C++day2——函数重载、默认形参和引用

一、函数重载 1、什么是函数重载&#xff1f; 在同一作用域下&#xff0c;函数名相同&#xff0c;参数列表不同的函数构成重载关系 函数重载与返回值类型、参数名无关 与作用域是否相同&#xff0c;以及参数列表的数量、参数类型、常属性不同等有关 2、C是如何实现函数重载的&a…...

Qt5下遍历QList的方法

lines定义如下 QMap<QString,Line> lines; Line的定义如下 class Line{protected:QString name;QColor color;QList<int> total_stations; // all statuibQList<QString> start_stas,end_stas; //start end stationQList<QList<QString>>sta_li…...

Leetcode 剑指 Offer II 043. 完全二叉树插入器

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 完全二叉树是每一层&#xff08;除最后一层外&#xff09;都是完…...

链路追踪Skywalking应用实战

目录 1 Skywalking应用2 agent下载3 agent应用3.1 应用名配置3.2 IDEA集成使用agent3.3 生产环境使用agent 4 Rocketbot4.1 Rocketbot-仪表盘4.2 Rocketbot-拓扑图4.3 追踪4.4 性能分析4.5 告警4.5.1 警告规则详解4.5.2 Webhook规则4.5.3 自定义Webhook消息接收 1 Skywalking应…...

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…...

Arm 架构 Ubuntu 使用 Docker 安装 Gitlab 并使用

官方 gitlab 文档 我的系统是 arm 架构的 ubuntu 官网没有提供 arm 架构的 docker 的 gitlab 的安装方式&#xff0c;直接安装的也是后来加的&#xff0c;文档也是随笔带过&#xff0c;&#xff0c;&#xff0c;我用到了&#xff0c;记录一下 默认已经安装了 docker 在 docker …...

百度地图3D棱柱鼠标事件

百度地图2D API JavaScript API | 百度地图API SDK 百度地图3D API jspopularGL | 百度地图API SDK 3D棱柱效果如下 一. 渲染地图 var map new BMapGL.Map(container, {style: {styleJson: styleJson2} }) map.centerAndZoom(new BMapGL.Point(116.404, 39.925), 9); map…...

PHP调用java class 类实现文件签名

PHP调用java class 类实现文件签名 原始代码改造开始PHP内调用方式起因:对接某平台API接口,发送的文件需要做 SM3 签名,对方平台是java写的,只有java加密示例,照着java的加密算法翻译为PHP版本,在编码转换上始终有些差异。没办法,只能想办法使用他们的java方式。 原始代…...

信号和槽机制

信号和槽机制 信号和槽的使用自定义信号槽信号槽机制是Qt框架中引以为豪机制之一,所谓信号槽实际就是类似于Gof中的观察者模式。当某个事件发生以后,比如点击一下按钮,按钮就会触发一个信号,这个信号按照类似广播的形式进行发送,如果某个对象对这个信号感兴趣就会触发连接…...

计算机视觉领域经典模型汇总(2023.09.08

一、RCNN系列 1、RCNN RCNN是用于目标检测的经典方法&#xff0c;其核心思想是将目标检测任务分解为两个主要步骤&#xff1a;候选区域生成和目标分类。 候选区域生成&#xff1a;RCNN的第一步是生成可能包含目标的候选区域&#xff0c;RCNN使用传统的计算机视觉技术&#x…...

华为云云耀云服务器L实例评测|在 Centos Docker 中使用Nginx部署Vue项目

目录 前言 项目构建 使用CentOS部署 安装Nginx 配置Nginx 项目启动 访问重定向 使用Docker部署 编写docker文件 dockerfile nginx dockercompose 项目启动 前言 本期我们测试在云耀云服务器L实例中分别演示如何在 系统镜像Centos 与 应用镜像 Docker 中使用Nginx…...

高频知识汇总 |【计算机网络】面试题汇总(万字长文通俗易懂)

我之前也已经在写了好几篇高频知识点汇总&#xff0c;简要介绍一下&#xff0c;有需要的同学可以点进去先收藏&#xff0c;之后用到时可以看一看。如果有帮助的话&#xff0c;希望大家给个赞&#xff0c;给个收藏&#xff01;有疑问的也可以在评论区留言讨论&#xff0c;能帮的…...

6.Flask-APScheduler定时任务框架

1.下载安装 pip install flask-apscheduler2.基本使用 from flask import Flask from flask_apscheduler import APScheduler app Flask(__name__) aps APScheduler() # 配置定时任务 scheduler { id: job1, func: scheduler:task, # 指向一个Python函数或方法…...

电脑入门:路由器访问控制列表基础知识

路由器访问控制列表基础知识   1、什么是访问控制列表?   访问控制列表在Cisco IOS软件中是一个可选机制,可以配置成过滤器来控制数据包,以决定该数据包是继续向前传递到它的目的地还是丢弃。   …...

目标检测笔记(十四): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv8介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练6.1 方式一6.2 方式二6.3 针对其他任务 七、模型验证八、模型测试九、模型转换9.1 转onnx9.1.1 方式一 9.2 转tensorRT9.2.1 trtexec9.2.2 代码转换9.2.3 推理代码 一…...

windows系统edge浏览器退出账户后还能免密登录的解决方式

edge浏览器明明退出登录了&#xff0c;还能不用输密码一键点击就能登录&#xff1b; 这是因为微软的煞笔产品经理用脚后跟想出来的方案。 解决方案&#xff1a; 去设置里的账号管理&#xff0c;注销自己的微软账号登录&#xff1b;如果你发现自己并没有登录&#xff0c;那么看…...

在Spring Boot项目中使用JPA

1.集成Spring Data JPA Spring Boot提供了启动器spring-boot-starter-data-jpa&#xff0c;只需要添加启动器&#xff08;Starters&#xff09;就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。 步骤01 添加JPA依赖。 首先创建新的Spring Boot项目…...

探讨Socks5代理IP在跨境电商与网络游戏中的网络安全应用

随着全球互联网的迅猛发展&#xff0c;跨境电商和在线游戏成为了跨国公司和游戏开发商的新战场。然而&#xff0c;与此同时&#xff0c;网络安全问题也日益突出。本文将探讨如何利用Socks5代理IP来增强跨境电商和网络游戏的网络安全&#xff0c;保障数据传输的隐私和安全性。 …...

T检验的前提条件|独立性|方差齐性|随机抽样

T检验是一种用于比较两组数据均值是否存在显著差异的统计方法&#xff0c;但在进行T检验之前&#xff0c;有一些前提条件需要满足&#xff0c;以确保结果的准确性和可靠性。这些前提条件包括&#xff1a; 正态性&#xff1a;T检验要求数据在每个组内都服从正态分布。正态性可以…...

【GO语言基础】变量常量

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】运算符 文章目录 系列文章目录常量和枚举变量声明全局变量声明大小写敏感 总结 常量和枚举 使用const关键字声明常量&#xff0c;并为每个常量提…...

C++QT day3

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 2> 自行封装一个循环顺序队列的类&#xff0c;包含…...

AI时代的较量,MixTrust能否略胜一筹?

人工智能的能力正在迅速接近人类&#xff0c;而在许多细分领域&#xff0c;已经超越了人类。虽然短期内这个突破是否会导致人工通用智能&#xff08;AGI&#xff09;还不清楚&#xff0c;但我们现在有的模型被训练成在数字交互中完美地模仿高能人类。尽管AGI仍不确定&#xff0…...

Ubuntu22.04 安装 MongoDB 7.0

稍微查了一些文章发现普遍比较过时。有的是使用旧版本的Ubuntu&#xff0c;或者安装的旧版本的MongoDB。英语可以的朋友可以移步Install MongoDB Community Edition on Ubuntu — MongoDB Manual&#xff0c;按照官方安装文档操作。伸手党或者英语略差的朋友可以按照本文一步步…...

【日志技术——Logback日志框架】

日志技术 1.引出 我们通常展示信息使用的是输出语句&#xff0c;但它有弊端&#xff0c;只能在控制台展示信息&#xff0c;不能灵活的指定日志输出的位置&#xff08;文件&#xff0c;数据库&#xff09;&#xff0c;想加入或取消日志&#xff0c;需要修改源代码 2.日志技术…...

mysql存储过程和函数

存储过程语法 设置变量&#xff1a; set dogNum 1002; 1、无参的存储过程 delimiter $ CREATE PROCEDURE 存储过程名() begin 存储过程体 end $; 2、有参数的存储过程 delimiter $ CREATE PROCEDURE 存储过程名(in|out|inout 参数名1 参数类型&#xff0c;参数名2 参数类型……...

【HDFS】Hadoop-RPC:客户端侧通过Client.Connection#sendRpcRequest方法发送RPC序列化数据

org.apache.hadoop.ipc.Client.Connection#sendRpcRequest: 这个方法是客户端侧向服务端发送RPC请求的地方。调用点是Client#call方法过来的。 此方法代码注释里描述了一个细节:这个向服务端发送RPC请求数据的过程并不是由Connection线程发送的,而是其他的线程(sendParams…...

Java基于 SpringBoot 的车辆充电桩系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1、效果演示效果图技术栈 2、 前言介绍&#xff08;完整源码请私聊&#xff09;3、主要技术3.4.1 …...

excel表导出

dto:查询条件所在的类 GetMapping(value "/downloadProject")ApiOperation("导出台账数据")AnonymousAccesspublic void queryDownload(Dto dto, HttpServletResponse response) throws IOException, ParseException {service.queryDownload(byPageDto, re…...

YOLOv8 快速入门

前言 本文是 YOLOv8 入门指南&#xff08;大佬请绕过&#xff09;&#xff0c;将会详细讲解安装&#xff0c;配置&#xff0c;训练&#xff0c;验证&#xff0c;预测等过程 YOLOv8 官网&#xff1a;ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONN…...

HJ48 从单向链表中删除指定值的节点

Powered by:NEFU AB-IN Link 文章目录 HJ48 从单向链表中删除指定值的节点题意思路代码 HJ48 从单向链表中删除指定值的节点 题意 输入一个单向链表和一个节点的值&#xff0c;从单向链表中删除等于该值的节点&#xff0c;删除后如果链表中无节点则返回空指针。 思路 单向链表…...