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

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...