C++进阶(一)

个人主页:PingdiGuo_guo
收录专栏:C++干货专栏

前言
本篇博客是讲解函数的重载以及引用的知识点的。
文章目录
前言
1.函数重载
1.1何为函数重载
1.2函数重载的作用
1.3函数重载的实现
2.引用
2.1何为引用
2.2定义引用
2.3引用特性
2.4常引用
2.5使用场景
2.6传值、传引用的效率对比
2.6.1作为参数
2.6.2作为返回值
2.7引用和指针的区别
2.7.1汇编层面
2.7.2语法
总结
1.函数重载
重载是指在同一作用域内,允许定义多个相同名称的函数或方法,但它们的参数列表不同。在调用时,根据参数的数量和类型的不同,编译器会自动选择匹配的函数或方法进行调用。
1.1何为函数重载
函数重载是指在同一个作用域内,允许定义多个函数,它们具有相同的名称但参数列表不同。当调用这个函数时,编译器通过参数的数量、类型或顺序来确定具体调用哪个函数。这样可以根据不同的参数类型或个数来实现同一个功能的不同实现方式。
1.2函数重载的作用
函数重载的主要作用有:
1. 方便使用:通过函数重载,可以使用同一个函数名来表示具有相似功能的函数,提高了函数的可读性和可理解性。
2. 简化编程:函数重载可以简化程序的编写,因为不需要为相似的功能编写不同的函数名,只需要在参数列表中添加不同的参数来区分不同的函数。
3. 提高代码复用性:通过函数重载,可以将相似功能的代码封装在同一个函数中,提高代码的复用性和维护性。
4. 适应不同的数据类型和参数个数:函数重载允许在不同的函数中使用不同的数据类型和参数个数,使函数可以处理不同类型和不同数量的数据。
总之,函数重载提供了一种更灵活和方便的程序设计方式,使函数的使用更加简单和高效。它是一种提高程序可读性、可维护性和可扩展性的重要手段。
1.3函数重载的实现
函数重载分好几种:
1.参数类型不同
#include<bits/stdc++.h>
using namespace std;
//参数类型不同
int da(int s,int a)
{cout<<a<<endl;return 0;
}
int da(int s,char a)//ok?
{cout<<a<<endl;return 0;
}
int main()
{int s=1,a=2;char b='4';//组一cout<<"1:"<<endl;da(s,a);da(s,b);return 0;
}
运行结果:

2.参数个数不同
#include<bits/stdc++.h>
using namespace std;
//参数个数不同
int ta(int s,int b,int a)
{cout<<b<<endl;return 0;
}
int ta(int s,int a)//ok?
{cout<<a<<endl;return 0;
}
int main()
{int s=1,a=2;int b=4;//组二cout<<"2:"<<endl;ta(s,b,a);ta(s,a);return 0;
}
运行结果:

3.参数类型顺序不同
#include<bits/stdc++.h>
using namespace std;
//参数类型顺序不同
int ea(int a,char s)
{cout<<a<<endl;return 0;
}
int ea(char s,int a)
{cout<<a<<endl;return 0;
}
int main()
{int s=1,a=2;char b='4';//组三cout<<"3:"<<endl;ea(a,b);ea(b,a);return 0;
}
运行结果:

2.引用
2.1何为引用
在C++编程语言中,引用概念是一种用于创建别名的机制。通过引用,可以使用一个变量或对象的别名来访问它。
例如,小刘的小名是纯纯,那我们既可以叫他小刘,也可以叫他纯纯。
2.2定义引用
定义引用的语法:
<数据类型> &<引用变量名> = <已存在的变量名>;
以下是一个完整的C++代码示例:
#include <iostream>
using namespace std;
int main() {int a = 10;int& b = a; // 定义一个整型引用b,它是a的别名cout << "a: " << a << endl; // 输出原始的变量a的值cout << "b: " << b << endl; // 输出引用b的值b = 20; // 修改引用b的值,也会影响到变量a的值cout << a << endl; // 输出修改后的变量a的值return 0;
}
在上述代码中,变量a是一个整型变量,而引用b是对a的引用。通过输出语句可以看到,变量a和引用b的初始值是相同的,而修改引用b的值后,变量a的值也相应改变。我们定义引用,相当于给变量或对象起了一个别名。
2.3引用特性
引用在定义时必须初始化
一个变量可以有多个应用
引用一旦引用一个实体,就不能再引用其他实体
#include <iostream>
using namespace std;
int main()
{int a = 1;//int& b;//引用未初始化int& c = a;//多个引用int& d = a;cout<<&c<<' '<<&d<<endl;return 0;
}
运行结果:


2.4常引用
#include <iostream>
using namespace std;
int main()
{const int a = 1;//int& s=a;//ok?//int& b = 10;//ok?const int& b = 10;float c;//int& n=c;//ok?return 0;
}
运行结果:

这里都不能运行,a为常量,无法运行,b为常量,无法运行,c和n类型不同,无法运行。
2.5使用场景
C++中引用的使用场景包括以下几个方面:
1. 函数参数传递:通过引用将参数传递给函数,在函数内部修改参数的值,可以直接对原始变量进行操作,避免了拷贝带来的额外开销。
void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}int main() {int x = 1, y = 2;swap(x, y);return 0;
}
2. 函数返回值:可以通过引用返回函数内部的局部变量,避免了拷贝带来的开销。
int& max(int& a, int& b) {return a > b ? a : b;
}int main() {int x = 1, y = 2;int& result = max(x, y);return result;
}
注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回;如果已经返还给系统,则必须使用值传递。即返回的实体必须要比函数的生命周期长,不能返回函数栈上的空间。在使用引用时要确保引用的对象存在,引用不能引用空指针。
2.6传值、传引用的效率对比
以值作为参数或者返回值类型,在传值和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝,因此用值作为参数或者返回值类型,效率是非常低的,尤其是当参数或者返回值类型非常大时,效率就更低。
2.6.1作为参数
代码来啦:
#include <bits/stdc++.h>
struct B{ int a[10000]; };
void TestFunc1(B a){}
void TestFunc2(B& a){}
void TestRefAndValue()
{B a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(B)-time:" << end1 - begin1 << '\n';cout << "TestFunc2(B&)-time:" << end2 - begin2 << '\n';
}
运行结果:

解释:大家可以看到,传引用的效率要“更上一层楼”,但为什么这里的传引用的时间是“0”呢?这是因为它的运行时间太短了,小于1毫秒,所以显示为“0”。
2.6.2作为返回值
代码来啦:
#include <bits/stdc++.h>
struct B{ int a[10000]; };
B a;
// 值返回
B TestFunc1() { return a;}
// 引用返回
B& TestFunc2(){ return a;}
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc1();size_t end1 = clock();// 以引用作为函数的返回值类型size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock();// 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << '\n';cout << "TestFunc2 time:" << end2 - begin2 << '\n';
}
运行结果:

解释:可以看出作为返回值效率更高。
2.7引用和指针的区别
2.7.1汇编层面
在汇编层面上,引用和指针之间的主要区别在于它们在内存中的表示和使用方式。
1. 引用:在汇编层面上,引用通常被实现为指针。当引用被创建时,编译器会将引用作为指针来处理,即将引用的名称作为一个指向所引用对象内存地址的指针。因此,引用在汇编层面上可以通过该指针来访问所引用的对象。与指针不同的是,引用在声明时必须初始化,并且无法更改引用的目标对象。
2. 指针:在汇编层面上,指针直接表示一个内存地址。指针变量存储了所指向对象在内存中的地址。通过加载和存储指令,可以使用指针来访问所指向的对象。与引用不同,指针可以被重新赋值,即指向不同的对象。
在使用引用和指针时,编译器在汇编层面上会生成不同的指令来处理对引用和指针的操作。引用的访问通常会被转换为加载和存储指令,而指针的访问可能会涉及更多的指针运算,如加法和减法操作。
2.7.2语法
1. 声明和初始化:在声明引用时,必须同时进行初始化。例如:int& ref = variable;,其中ref是一个引用,它被初始化为variable。而指针的声明可以先进行,然后再进行初始化,也可以不进行初始化。例如:int* ptr = nullptr;,其中ptr是一个指针,它被初始化为nullptr。
2. 语法符号:引用使用&符号进行声明和引用操作,例如:int& ref = variable;。指针使用*符号进行声明和解引用操作,例如int* ptr = &variable;。
3. 空值和空引用:指针可以被赋予空值(nullptr),表示指针不指向任何有效的内存地址。引用则不允许为空,必须在声明时进行初始化,并且只能引用有效的内存地址。
4. 变量的地址:引用本身没有独立的内存地址,它只是已存在变量的一个别名。而指针是一个变量,它存储了所指向对象在内存中的地址。
5. 内存操作:通过引用操作所引用的变量,可以直接修改引用所指向的内存内容。而通过指针,可以通过解引用操作修改所指向的内存内容。
总的来说,引用必须进行初始化,不能为null,没有独立的内存地址;而指针可以先声明再初始化,可以为null,有自己独立的内存地址。
总结
本篇博客到这里就结束了,制作不易,还是希望大家点赞支持,谢谢大家!
相关文章:
C++进阶(一)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...
深度解读DeepSeek:开源周(Open Source Week)技术解读
深度解读DeepSeek:开源周(Open Source Week)技术解读 深度解读DeepSeek:源码解读 DeepSeek-V3 深度解读DeepSeek:技术原理 深度解读DeepSeek:发展历程 文章目录 一、开源内容概览Day1:FlashMLAD…...
AI Agent开发与应用
AI Agent开发与应用:本地化智能体实践——本地化智能体开发进展与主流框架分析 我要说的都在ppt里面了,相关复现工作请参考ai agent开发实例 OpenManus Dify Owl 第二个版本更新了对话的框架,通过gradio做了一个全新的界面 只测试了阿里云…...
石斛基因组-文献精读122
A chromosome-level Dendrobium moniliforme genome assembly reveals the regulatory mechanisms of flavonoid and carotenoid biosynthesis pathways 《染色体水平的石斛基因组组装揭示了黄酮类和胡萝卜素生物合成途径的调控机制》 摘要 石斛(Dendrobium monil…...
javaSE.多维数组
1 final 引用类型 final int[] arr 继承Object 的引用类型,不能改变引用的对象 存的其实是引用 数组类型数组,其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...
Spring IOC容器详解:深入理解控制反转与依赖注入
一、什么是IOC? 在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类…...
Python条件处理,新手入门到精通
Python条件处理,新手入门到精通 对话实录 **小白**:(崩溃)我写了if x 1:,为什么Python会报错? **专家**:(推眼镜)**是赋值,才是比较**!想判断相…...
JPA实体类注解缺失异常全解:从报错到防御!!!
🚨 JPA实体类注解缺失异常全解:从报错到防御 🛡️ 一、💥 问题现象速览 // 经典报错示例 Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.Product典型症状: &…...
Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析
在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring…...
生成式媒介革命已至,搜索如何借力DeepSeek破局?
作为前沿AI技术的代表,DeepSeek不仅突破了传统大模型的算力瓶颈,更以“高性能低成本开源生态”的特性,重塑传播生态。对于搜索行业从业者而言,这场技术变革既是机遇,也是挑战。 DeepSeek的三大“杀手锏”,…...
【Vue3入门1】02- Vue3的基本操作(上)
本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...
【C语言】多进程/多线程
【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务,提高了系统的资源利用率和程序的运行效率…...
模糊数学 | 模型 / 集合 / 关系 / 矩阵
注:本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常,请看原文。 模糊数学模型:隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…...
Browserlist 使用指南:应对浏览器兼容性问题的解决方案
前言 在前端开发中,我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多,处理这些问题可能会让人感到头疼。幸运的是,有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法…...
QinQ项展 VLAN 空间
随着以太网技术在网络中的大量部署,利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特,仅能表示 4096 个 VLAN,无法满足城域以太网中标识大量用户的需求,于是 QinQ 技术应运而生。…...
数据结构—树(java实现)
目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...
Unity射击游戏手榴弹笔记
数据 在物品系统增加一个新的物品类,手榴弹类,定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组;手榴弹的预制体需要可拾取的、扔出的;背包界面增加背包内的手榴弹、场景里的手榴弹、别人…...
S32K144外设实验(七):FTM输出多路互补带死区PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…...
SingleMod
SingleMod SingleMod是一种深度学习模型,专为利用纳米孔直接RNA测序(DRS)数据在单RNA分子中精确检测m6A修饰而设计。该模型通过深度多实例回归框架进行训练,能够充分利用广泛的甲基化率标签。SingleMod是一个通用框架,可轻松适配其他核酸修饰的检测模型训练。 注意: Si…...
[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]
常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接; /proc/pid…...
单纯形法之大M法
1. 问题背景与标准化 在求解某些线性规划问题时,往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时,我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题(假设为最大化问题)&am…...
各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写
上一篇下一篇RNN(中集)待编写 代码详解 pytorch 官网主要有两个可调用的模块,分别是 nn.RNNCell 和 nn.RNN ,下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的,只需要将对输入…...
DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升
DeepSeek 发布 DeepSeek-V3-0324 版本 DeepSeek 发布 DeepSeek-V3-0324 版本,在其前代模型 DeepSeek-V3 的基础上进行了显著升级。 该模型专注于中文和多语言文本生成、推理、代码编写等综合能力的提升,支持 Function Calling(函数调用&…...
航班时间 | 第九届蓝桥杯省赛C++A组
小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。 小 hh 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于…...
传输层安全协议 SSL/TLS 详细介绍
传输层安全性协议TLS及其前身安全套接层SSL是一种安全传输协议,目前TLS协议已成为互联网上保密通信的工业标准,在浏览器、邮箱、即时通信、VoIP等应用程序中得到广泛的应用。本文对SSL和TLS协议进行一个详细的介绍,以便于大家更直观的理解和认…...
编程实现自我指涉(self-reference)
从计算机的组成原理出发,编程实现自我指涉(self-reference)本质上是通过代码操纵代码,形成逻辑上的闭环。这种能力不仅是编程语言设计中的一个奇妙现象,更是计算理论、计算机架构、乃至哲学层面的一种深刻映射。让我们…...
CentOS8 安装 Docker-CE
如果之前安装过docker,请先卸载旧版本: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装所需的软件包: yum install -y yum-utils 添加软件源信息(设置存储库)…...
【Docker系列八】使用 Docker run 命令部署 Nginx
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【单元测试】
一、框架 不同的编程语言有不同的测试框架,以下是一些常见的测试框架: 1)Java:JUnit、TestNG2)Python:unittest、pytest3)JavaScript:Jest、Mocha4)C#:NUni…...
【今日EDA行业分析】2025年3月24日
今日 EDA 行业分析:中国在全球格局下的奋进之路 一、引言 在半导体产业的精密体系中,EDA 软件宛如一颗璀璨的明珠,其重要性不言而喻。它不仅是集成电路设计的核心支撑,更是连接芯片设计、制造、封装与测试各环节的关键纽带。今天…...
