函数重载和引用【C++】

news2024/12/26 12:24:48

文章目录

  • 函数重载
    • 什么是函数重载?
    • 函数重载的作用
    • 使用函数重载的注意点
    • 为什么C++可以函数重载,C语言不行?
  • 引用
    • 什么是引用?
    • 引用的语法
    • 引用的特点
    • 引用的使用场景
    • 引用的底层实现
    • 传参时传引用和传值的效率
    • 引用和指针的区别

函数重载

什么是函数重载?

函数重载:

重载函数是函数的一种特殊情况。
为方便使用,C++允许在同一作用域中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指1.参数的个数 2.类型 3.顺序)必须至少有一个不同
根据这些同名函数的参数表的不同,达成传入参数类型不同,调用的函数不同的效果


函数重载的作用

功能类似的函数可以用同一名字,不用费心思去取差别不大的名字


在这里插入图片描述
如果不用函数重载,就要给Swap,取Swap1,Swap2等名字容易混淆


使用函数重载的注意点

  • 函数重载与函数的返回值无关

  • 同名参数表不同参数表不同即参数类型不同或参数个数不同或参数顺序不同满足三个条件中的一个就行)】的函数就可以构成重载

参数类型不同:

在这里插入图片描述

参数个数不同:

在这里插入图片描述
参数顺序不同:
在这里插入图片描述

  • 只有同一作用域中的同名参数表不同函数才构成重载
    不同命名空间/类中的同名函数不可能构成重载

  • 重载函数也可以参数缺省

    在这里插入图片描述

这个时候就要注意:不要因为少传参数而导致调用的重载函数不明确

在这里插入图片描述


为什么C++可以函数重载,C语言不行?

这就又涉及到编译链接了,因为C++是在C语言的基础上出现的,而且C++是兼容C语言的【即C语言的语法在C++编译器中也能使用】所以C++的编译链接过程和C语言很像

不了解编译和链接的可以看我这篇文章:c语言编译和链接)

为什么C++可以函数重载,C语言不行?这一问题主要是在编译链接时的编译汇编时的符号汇总形成符号表【符号表:可以简单的将其视为 词法分析时拆分出来的所有特殊符号+该特殊符号对应的地址共同制作出的一份方便链接的表】的时候

C语言编译链接时函数名进入符号表时表中对应的特殊字符就是它的函数名【不做任何修饰】

而C++的函数进入符号表时表中对应的特殊字符是编译器根据该函数的参数表编译器自己的修饰规则每个编译器的修饰规则不同】对该函数名进行修饰之后的特殊符号,而不是单纯的函数名

上面的差异就在编译链接的链接部分起了不同的作用

因为链接是根据符号表中的特殊符号的名字找它的地址,并以此看它有没有定义
而C语言如果函数名同名了,那进入符号表的都是它的函数名根本区分不开,就算两个函数都有定义有地址,链接时编译器根本不知道找那个。

但C++不同它进入符号的是编译器根据该函数的参数表编译器自己的修饰规则修饰之后的符号,如果它的参数不同修饰后的符号就不同,链接时编译器“一眼“就看出不同了


引用

什么是引用?

引用是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

即使用一个变量的引用就是使用该变量,修改它的引用也是修改变量自己


在这里插入图片描述


引用的语法

源变量的类型+&+别名=源变量名


在这里插入图片描述


引用的特点

  • 引用必须初始化

  • 一个变量可以有多个引用

    在这里插入图片描述

  • 引用一旦引用一个实体后就不能去引用其他实体了


如果直接=,就是赋值

在这里插入图片描述

在这里插入图片描述


引用的使用场景

引用可以做参数,可以达到类似指针的效果


在这里插入图片描述
这样设计Swap的参数的话,形参a,b就是实参a,c的引用,那么该a,b就是改a,c,改形参就是改实参


引用的底层实现

引用的底层【汇编层次】实现其实是和指针一样的

都是开出一个指针大小的空间将引用(指向)的变量的地址放进去

但是使用上却不同,为什么呢?

其实是编译器进行了隐式的包装,我们使用引用时使用到的就是那一层包装

所以一般认为:
引用语法上是不开空间的,引用和它引用的源变量共用一个空间

指针语法上是开空间的,将指向的对象的地址存入开出的空间


传参时传引用和传值的效率

传引用效率更高,因为引用底层实现是和指针一样的,开空间存地址

所以传参时,如果形参是引用,那么实参传递的其实是实参的地址


引用和指针的区别

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

  2. 引用在定义时必须初始化,指针没有要求

  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

  4. 有多级指针,但是没有多级引用

  5. 没有NULL引用,但有NULL指针

  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

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

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

相关文章

QT Creator概览

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Qt Creator 概览 ①:菜单栏 ②:模式选择 ③:构建套件选择器…

Vue2电商前台项目(二):完成Home首页模块业务

一、项目开发的步骤 1、书写静态页面(HTML,CSS) 2、拆分组件 3、获取服务器的数据动态展示 4、完成相应的动态业务逻辑 经过分析之后,Home首页可以拆分为7个组件:TypeNav三级联动导航,ListContainer&…

深入解析:如何使用Xcode上传苹果IPA安装包至App Store?

目录 引言 摘要 第二步:打开appuploader工具 第二步:打开appuploader工具,第二步:打开appuploader工具 第五步:交付应用程序,在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用商…

【保姆级讲解如何安装与配置Node.js】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Arduino开发 esp32cam+opencv人脸识别距离+语音提醒

效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用&#xff08;修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …

【C语言】if语句选择题

前言 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 前言 关于if语句相关的选择题 题目一&#xff1a; 关于if语句说法正确是&#xff1a;( ) A .if语…

[StartingPoint][Tier1]Crocodile

Task 1 What Nmap scanning switch employs the use of default scripts during a scan? (哪些 Nmap 扫描开关在扫描期间使用默认脚本&#xff1f;) -sC Task 2 What service version is found to be running on port 21? 发现端口 21 上运行的服务版本是什么&#xff1f…

隐私计算实训营学习七:隐语SCQL的架构详细拆解

文章目录 一、SCQL Overview1.1 SCQL背景1.2 SCQL Overview 二、SCQL CCL三、SCQL架构 一、SCQL Overview 1.1 SCQL背景 SCQL&#xff1a;属于隐私计算BI范畴&#xff0c;允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析。 如下数据在不同机构&#xf…

CCleaner如何还原系统 CCleaner怎么恢复注册表 ccleaner官方下载

CCleaner是一款电脑清理软件&#xff0c;其中的注册表清理功能是该软件很重要的功能。注册表作为电脑的重要文件&#xff0c;不可以随便清理&#xff0c;而CCleaner可以帮我们安全&#xff0c;快速地清除注册表。同时&#xff0c;CCleaner还有还原系统的功能。下面将为大家介绍…

ST表(Segment Tree)

目录 1.概述 2.引入 3.ST表对引入的优化 1.概述 ST表是一种基于树形结构的数据结构&#xff0c;用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中&#xff0c;以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn)&#xff0c;其中n为原始数据…

07 | Swoole 源码分析之 Channel 通道模块

原文首发链接&#xff1a;Swoole 源码分析之 Channel 通道模块 大家好&#xff0c;我是码农先森。 引言 通道&#xff0c;用于协程间通讯&#xff0c;支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。 通道与 PHP 的 Array 类似&#xff0c;仅占用内存&am…

非关系型数据库(缓存数据库)redis的基础认知与安装

目录 一.关系型数据库和非关系型数据库 关系型数据库 非关系型数据库 关系数据库与非关系型数据库的区别 ①非关系数据 关系型数据库 非关系型数据库产生背景 数据存储流向 非关系型数据库 关系数据库 二.redis的简介 1.概念 2.Redis 具有以下几个优点: 3.Redi…

Salesforce团队:科技文档的受众比你想象要多

▲ 搜索“大龙谈智能内容”关注公众号▲ 扫码见我视频号上的视频 视频时长为38分钟&#xff0c;如果你没有时间看&#xff0c;这里是我用AI做的总结&#xff1a; 视频总结 Salesforce的文档团队成员讨论了文档在销售过程中对潜在客户的重要性。 集锦 00:48 &#x1f4a1; S…

Java简单实现一个LRU(最近最少使用淘汰策略)

目录 LRU介绍&#xff1a; 一些淘汰策略&#xff1a; Java简单实现LRU&#xff1a; 测试&#xff1a; ​编辑 实现原理&#xff1a; LRU介绍&#xff1a; LRU 是 "Least Recently Used" 的缩写&#xff0c;意为"最近最少使用"。它是计算机科学中的一种…

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了&#xff0c;找什么东西搜索都很麻烦&#xff0c;之前有写过eide的文章&#xff0c;想着能不能在eide里面就把debug也做了&#xff0c;发现真的可以&#xff0c;下面记录一下&#xff0c;主要是参考这个大佬的文章&#xff0c;非常感谢。…

k8s CNI Calico 网络模式总结

目录 calico架构图 IPIP模式下的架构图 calico 核心组件 Overlay 网络模式&#xff1a; Pod IP对外暴露 不对外暴露&#xff1a; 实现对外暴露的方法&#xff1a; overlay模式下的网络MTU Iptables & ipvs overlay的主要缺点&#xff1a; Full-mesh Unoverla…

Java毕业设计 基于SSM jsp商城系统 美妆系统

Java毕业设计 基于SSM jsp商城系统 美妆系统 SSM jsp 商城系统 美妆系统 功能介绍 首页 分类展示商品 搜索商品 登录 注册 邮箱激活 购物车 结算 支付 我的订单 个人信息设置 后台管理 登录 商品管理 添加修改下架商品 商品类型管理 添加修改删除分类 订单管理 确认发货 取消…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9&#xff0c;是k个数的和 树的宽度是1-9&#xff0c;树的深度是k 1.确定递归函数的返回值及参数&#xff1a; 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如&#xff1a;&#xff08;1&#xff0c;2&…

Web攻击越发复杂,企业如何保护云上业务

如今&#xff0c;电子政务、电子商务、网上银行、网上营业厅等依托Web应用&#xff0c;为广大用户提供灵活多样的服务。在这之中&#xff0c;流量攻击堪称是Web应用的最大敌人&#xff0c;黑客通过流量攻击获取利益、竞争对手雇佣黑客发起恶意攻击、不法分子通过流量攻击瘫痪目…

[VulnHub靶机渗透] pWnOS 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…