当前位置: 首页 > 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;并为每个常量提…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...