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

【C++入门】详解(中)

目录

💕1.函数的重载

💕2.引用的定义

💕3.引用的一些常见问题 

💕4.引用——权限的放大/缩小/平移

 💕5. 不存在的空引用

💕6.引用作为函数参数的速度之快(代码体现)

 💕7.引用的思考 


(最新更新时间——2025.1.9)

一个人的坚持到底有多难

在座的各位都能回答这个问题!


💕1.函数的重载

在C++中,是支持函数的名称重复的,但并不是完全重复

要求这些同名函数作用在同一作用域

且函数的形参不同->:可以是 参数类型不同 或者 参数个数不同 或者 参数顺序不同,这也叫做函数的重载

那么,函数的重载具体是什么呢?代码如下:

 第一种情况:同名函数的形参类型不同——函数的重载

26a001a36ed34a6f846c5765ed193791.png

由代码可见,同名函数的形参是不同的,但是依旧可以运行,没有报错,我们也不必担心编译器会不知道运行哪个函数,因为在我们使用函数传参时,编译器会智能的去辨别类型,进而判断出该用哪个函数

第二种情况:同名函数的参数个数不同——函数的重载
fc5ac47b1a784280a92a24fb7bf919f6.png
由此可见,同名函数的参数的个数不同可以构成函数的重载

第三种情况:同名函数的形参类型顺序不同——函数的重载

52cc16e5d91c440aadaf14bc8f7e5858.png

需要注意的是,形参的顺序不同需要满足同名函数的形参类型不能完全相同,如下:

b14ea0d5fa3a4f4c86e3737fb1b841e1.png

如果这么写的话,编译器也会不知道该调用哪个函数,这叫做调用歧义

注意点:返回值不可以作为函数重载的判断,因为调用时也无法区分


小练习->:

判断下面代码是否构成函数的重载

namespace bit1
{void total(int pa, int pb){cout << "total(int pa, int pb)" << endl;}
}namespace bit2
{void total(int px, int py){cout << "total(int px, int py)" << endl;}
}
int main()
{bit1::total(3, 5);bit2::total(8, 8);
}

答案是否定的,因为两个同名函数并不作用于同一作用域下,所以并不构成函数的重载


💕2.引用的定义

在C++中,提出了“引用”的功能,什么是引用呢?


引用其实就是变量的别名

就相当于,你们班有一个学习特别好的人,数理化每次都是第一,那么这个同学就会获得三个别名,分别是“数学第一”,“物理第一”,“化学第一”,当你说数学第一时,大家知道你说的是他,当你说物理第一时,大家也知道你说的是他,这就叫做别名

引用书写方法->:

f551396be41d46358588cbffcd0d4923.png

我们知道,学习C语言时, & 是取地址的意思,难道在C++中改变了吗?

其实没有,只有在你像图中这么使用时才会变为引用的意义

此时,b为a的别名,那么我们调用b的时候,其实就是调用a


问题:我们在创建别名时,是开辟了新的空间吗?

我们可以验证一下:

b7f24dabd7f143eaa72ebf1a3fd8ed26.png

我们发现,b与a的地址一样,所以在引用时,并不会开辟新的空间,只会创建一个“别名”


💕3.引用的一些常见问题 

各位可以思考一下,这种情况下a,b会交换吗?

#include<iostream>
using namespace std;
void Swap(int& ta, int& tb)
{int tmp = ta;ta = tb;tb = tmp;
}int main()
{int a = 100;int b = 20;Swap(a, b);cout << a <<" " << b << endl;
}

答案是会的,为什么?


我们先回到C语言时学习的交换,在C语言中,我们知道,如果不传地址的话,就无法改变两者的值,因为形参是实参的一份临时拷贝,swap函数会将a与b复制一份传给ta,tb,这时候会开辟新的地址空间,操作的是 ta 与 tb

3782cdfd52684aceb213d191f84dbe23.png


但是这样却交换了,首先我们知道,除去变量名就是变量类型,我们在形参中的变量类型是int&类型,这种类型本身就是引用,是属于一个别名,所以我们将a传过去时,会将a的引用

传给形参,实际上发生的是int& ta = a,int& tb = b;

此时ta与tb就是别名,而上述我们提到过,引用是不会开辟新的空间的,所以实际上操作的就是a与b

dc2785ce4d56485a936442da06100ea6.png


注意小点1->:

在使用引用的过程中,我们也可以给别名引用,起出别名的别名,如下->:

b4e357b49db542d3b6be6df0b293cff6.png


 注意小点2->:

在使用引用时,必须进行初始化,不可以说创建int&后就扔掉了,等一会有需要再用,代码如下:

744f6ba213a34b1595105681d3d4d2c8.png


 注意小点3->:

一个变量可以有多个引用,但一个引用只可以绑定一个变量

#include<iostream>
using namespace std;int main()
{	int a = 10;int& b = a;int& c = a;int l = 100;c = l;}

以上代码的含义是什么?

A.让l赋值给C?

B.让c成为l的别名?


答案是A,引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体,所以这里是赋值

💕4.引用——权限的放大/缩小/平移

 在C++中,存在权限的放大,缩小,以及平移的问题,那么什么是权限的放大/缩小/平移呢?

请看代码->:

个人认为,权限的放大可以分为地址类与非地址类,首先讲解非地址类


非地址类->:

	//非地址时//权限的平移int a1 = 10;int& b1 = a1;//权限的缩小int a2 = 100;const int& b2 = a2;//权限的放大const int a3 = 100;//int& b3 = a3;  这里是错误写法//正确书写 const int& b3 = a3;

权限的平移(合法)->:

我们的变量a1是 int 类型的,而引用的b1也是 int 类型的,这说明类型的功能没有改变,属于权限的平移


权限的缩小(合法)->:

我们的a2是 int 类型的,而引用的b2是const int 类型的,我们知道,被const修饰后的变量,只可以读不可以修改,所以我们把一个既可以读又可以修改的变量,取了一个只可以读不可以修改的别名,这是属于权限的缩小,是合法的


权限的放大(非法)->:

我们的a3是const int 类型的,只可以读不可以修改,但是如果我们运行了错误的写法

(int& b3 = a3),那么就把只能读不能改的变量,取了一个即可以读又可以改的别名,这样的话,我们的b3是可以修改的,但是b3是a3的别名,我的本体不可以被修改,我的分身却可以修改我,这是权限的放大,是非法的


地址类->:

	//地址情况int a1 = 10;//权限的平移int* p1 = &a1;int*& pp = p1;//权限的缩小int* pp1 = &a1;const int* p2 = pp1;//权限的放大const int* p3 = &a1;int* p4 = p3;int*& p4 = p3;

原理与上述相同,但需要注意的是,权限的缩小并没有运用到别名,只是单纯的赋值,这也说明,权限的放大/缩小/平移,并不只是单独存在于引用之中,同时我们还需要注意一下写法

	//权限的缩小int* pp1 = &a1;const int* p2 = pp1;const int*& p3 = pp1;	//	错误的写法

为什么?因为它单纯触发了C++中const的安全保障,为了防治你用错间接修改上,所以禁止使用


思考->:

    //这是权限的放大吗?int a1 = 10;int b1 = 20;const int& r1 = a1 + b1;

答案是,是的,因为a1+b1得到的值是可以修改的,而r1不可以修改,所以这也是权限的放大


 💕5. 不存在的空引用

在我们使用引用时,是不可以实现空引用的,如下->:

ab23cf5aec6f489f8c638a912a34c949.png

但是有一种写法是合法的->:如下:

	int* ptr = NULL;int& r = *ptr;cout << r << endl;

只不过打印不出来什么


💕6.引用作为函数参数的速度之快(代码体现)

运行以下代码,可以知道引用作为参数的运行快在哪里

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
struct A { int a[10000]; 
};
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A 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(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}int main()
{TestRefAndValue();return 0;
}

我们可以发现,不以引用作为参数的话,那么在运行函数前就会重新开辟新的空间来作为临时变量,这需要消耗大量的栈佂与时间

而如果用引用作为参数的话,那么就不会开辟新的地址,因为实际运行的是A& a = i;这属于引用创建的别名,没有开辟新的空间,正如上述所讲,地址没有发生改变


 💕7.引用的思考 

int main()
{// 权限可以平移/缩小 不能放大double d = 12.34;// 类型转换int i = d;int& r2 = d;//报错const int& r1 = d;//不报错//r1不能修改dreturn 0;
}

我们知道,在 int i = d 时,因为类型的不同,所以它其实是有一个隐式类型转换的,此时,会将 d 复制一份并强制转化为 int类型 再赋值给 i ,所以 i 其实是复制 d 的一份 int 类型的值

其次当我们使用int& r2 = d时,因为d是double类型的,r2是int类型的,这里属于运算,还是会存在隐式类型转换,所以 r2 其实是 强制转化后的 d ,但是因为强制转化所生成的值是临时变量,临时变量是不可修改的,但是int& r2是可以修改的,这属于权限的放大,所以是不对的

那为什么我们使用const int& r1 = d 时,就不会报错呢?这里其实还是会因为类型的不同而存在强制类型转化只要是运算就会存在强制类型转化,此时d还是会被复制一份并强制转化为int类型,而 r1 就是强制 int 类型的 d 的别名,但是被const修饰了,那就说明我们不可以对其进行修改值,属于权限的平移,也就不会报错,如果你想打印 r1 的话,你会发现打印出来的是 12 

5cbe13136c2b4135a9f151baa91fa5ef.png

相关文章:

【C++入门】详解(中)

目录 &#x1f495;1.函数的重载 &#x1f495;2.引用的定义 &#x1f495;3.引用的一些常见问题 &#x1f495;4.引用——权限的放大/缩小/平移 &#x1f495;5. 不存在的空引用 &#x1f495;6.引用作为函数参数的速度之快&#xff08;代码体现&#xff09; &#x1f4…...

深度学习的加速器:Horovod,让分布式训练更简单高效!

什么是 Horovod&#xff1f; Horovod 是 Uber 开发的一个专注于深度学习分布式训练的开源框架&#xff0c;旨在简化和加速多 GPU、多节点环境下的训练过程。它以轻量级、易用、高性能著称&#xff0c;特别适合需要快速部署分布式训练的场景。Horovod 的名字来源于俄罗斯传统舞…...

计算机的错误计算(二百零八)

摘要 用两个大模型计算 arccot(0.9911588354432518e10) . 保留16位有效数字。两个的输出均是错误的。代码的输出格式亦均出错。 本节题目为一读者来信提议&#xff08;不知该题目有何玄机&#xff1f;&#xff09;。 例1. 计算 arccot(0.9911588354432518e10) . 保留16位有…...

海康机器人IPO,又近了一步

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 海康机器人的IPO之路&#xff0c;一路跌宕起伏&#xff0c;让无数投资者和业内人士关注。这不仅仅是一家企业的上市之旅&#xff0c;更是中国智能制造…...

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…...

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…...

阅读笔记——《A survey of protocol fuzzing》

【参考文献】Zhang X, Zhang C, Li X, et al. A survey of protocol fuzzing[J]. ACM Computing Surveys, 2024, 57(2): 1-36.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 1、Introduction 2、Background 2.1、Communication Pro…...

C# 语法中级

总目录 C# 语法总目录 C# 语法中级 lambda 表达式1. 捕获外部变量2. 捕获迭代变量 匿名类型匿名方法异常相关1. 枚举器2. 可枚举对象3. 迭代器3. 迭代器语义4. yield break 语句5. 组合序列 可空类型1. Nullable< T > 结构体 lambda 表达式 编译器在内部将lambda表达式编…...

STORM:从多时间点2D图像中快速重建动态3D场景的技术突破

随着计算机视觉和机器学习技术的迅猛发展,我们已经能够利用AI来解决许多复杂的问题。然而,在处理大规模室外动态3D场景重建时,现有的方法往往面临着诸多挑战,如需要大量人工标注数据、处理速度慢以及难以准确捕捉移动物体等。为了解决这些问题,研究者们开发了STORM(Spati…...

excel前缀和(递增求和)

方法一&#xff1a;https://www.zhihu.com/zvideo/1382164996659515392?utm_id0 假设输入数据在B2:B10&#xff0c;选中单元格C2&#xff0c;输入SUM(B2:B2&#xff0c;然后选中其中的B2&#xff0c;按F4&#xff08;或者直接输入SUM(B$2:B2&#xff09;&#xff0c;回车确认&…...

【AI日记】25.01.11 Weights Biases | AI 笔记 notion

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales笔记&#xff1a;我的 AI 笔记主要记在两个地方 有道云笔记&#xff1a;数学公式和符号比较多的笔记notion&#xff1a;没什么数学公式的…...

P8772 [蓝桥杯 2022 省 A] 求和

题目描述 给定 &#x1d45b; 个整数 &#x1d44e;1,&#x1d44e;2,⋯ ,&#x1d44e;&#x1d45b; 求它们两两相乘再相加的和&#xff0c;即 &#x1d446;&#x1d44e;1⋅&#x1d44e;2&#x1d44e;1⋅&#x1d44e;3⋯&#x1d44e;1⋅&#x1d44e;&#x1d45b;&…...

【Oracle篇】深入了解执行计划中的访问路径(含表级别、B树索引、位图索引、簇表四大类访问路径)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…...

WSDL的基本概念

《WSDL 语法》这篇文章将详细介绍WSDL&#xff08;Web Services Description Language&#xff09;的语法。WSDL是一种基于XML的语言&#xff0c;用于描述Web服务及其访问方式。它允许开发者将Web服务定义为服务访问点或端口的集合&#xff0c;这些服务访问点可以通过特定的协议…...

RabbitMQ解决消息积压的方法

目录 减少发送mq的消息体内容 增加消费者数量 批量消费消息 临时队列转移 监控和预警机制 分阶段实施 最后还有一个方法就是开启队列的懒加载 这篇文章总结一下自己知道的解决消息积压得方法。 减少发送mq的消息体内容 像我们没有必要知道一个的中间状态&#xff0c;只需…...

Android 网络层相关介绍

关注 Android 默认支持的网络管理行为,默认支持的网络服务功能。 功能术语 术语缩写全称释义DHCPv6Dynamic Host Configuration Protocol for IPv6动态主机配置协议的第六版,用于在IPv6网络中动态分配IP地址和其他网络配置参数。DNS Domain Name System域名系统。LLALink-Loc…...

2025年第三届“华数杯”国际赛B题解题思路与代码(Matlab版)

问题1&#xff1a;产业关联性分析 在 question1.m 文件中&#xff0c;我们分析了中国主要产业之间的相互关系。以下是代码的详细解读&#xff1a; % 问题1&#xff1a;分析中国主要产业之间的相互关系function question1()% 清空工作区和命令窗口clear;clc;% 设置中文显示set…...

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…...

k8s dashboard离线部署步骤

确定k8s版本&#xff0c;以1.23为例。 部署metrics-server服务&#xff0c;最好用v0.5.2。 用v0.6.0&#xff0c;可能会报以下错误&#xff1a; nodekubemaster:~/Desktop/metric$ kubectl top nodes Error from server (ServiceUnavailable): the server is currently unabl…...

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程&#xff08;2024最新版&#xff09;_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具&#xff1a;用来抓取数据包的一个软件 wireshark的功能&#xff1a;用来网络故障排查&#xff1b;用来学习网络技术 wireshark下…...

稀疏矩阵:BM25;稠密矩阵:RoBERTa - wwm - ext顺序

稀疏矩阵:BM25;稠密矩阵:RoBERTa - wwm - ext顺序 先后顺序 先BM25后RoBERTa - wwm - ext: 流程说明:首先可以使用BM25进行初步的检索。由于BM25是基于词频等统计信息的检索模型,它能够快速地从大规模文档集合中筛选出可能包含相关信息的文档子集。例如,在一个包含大量新…...

C# 结构体(Struct)

C# 结构体(Struct) 引言 在C#编程语言中,结构体(Struct)是一种值类型,它允许用户自定义数据类型。结构体可以包含多个成员,如字段、属性、构造函数和方法。与类(Class)相似,但结构体在内存管理、性能和继承方面有其独特的特点。本文将详细介绍C#结构体的概念、用法…...

Homestyler 和 Tripo AI 如何利用人工智能驱动的 3D 建模改变定制室内设计

让设计梦想照进现实 在Homestyler,我们致力于为每一个梦想设计师提供灵感的源泉,而非挫折。无论是初学者打造第一套公寓,或是专业设计师展示作品集,我们的直观工具都能让您轻松以惊人的3D形式呈现空间。 挑战:实现定制设计的新纪元 我们知道,将个人物品如传家宝椅子、…...

Python的pandas库基础知识(超详细教学)

目录 一、配置环境 二、序列和数据表 2.1 初始化 2.2 获取数值 2.3 获取索引 2.4 索引取内容 2.5 索引改变取值 2.6 字典生成序列 2.7 计算取值出现次数 2.8 数据表 2.9 数据表添加新变量 2.10 获取列名 2.11 根据列名获取数据 2.12 输出固定行 2.13 输出多行…...

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据&#xff1a;描述事物的符号记录 数据库&#xff08;DB&#xff09;&#xff1a;长期存储在计算机内的、…...

大数据智能选课系统

1.产品介绍 产品名称&#xff1a;大数据智能选课系统 一、产品概述 随着信息技术的快速发展&#xff0c;大数据技术在教育领域的应用越来越广泛。针对当前高校选课过程中的繁琐操作、资源分配不均等问题&#xff0c;我们研发了一款基于大数据智能分析的选课系统。本系统旨在…...

esp32开发笔记之一:esp32开发环境搭建vscode+ubuntu

最近想用esp32做一个物联网项目&#xff0c;踩坑N个终于有点心得&#xff0c;写下来避免和我一样的小白踩无谓的坑。 写在前面&#xff1a; 第一&#xff0c;大家一定要用linux系统作为编译工具&#xff0c;速度上是windows无法比的&#xff0c;不要因为不熟悉linux而选择win…...

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…...

Trie树算法

Trie树&#xff0c;也称为前缀树或字典树&#xff0c;是一种特殊的树型数据结构。它用于存储一组字符串&#xff0c;使得查找、插入和删除字符串的操作非常高效。类似这种&#xff0c; 模板&#xff1a; 这是用数组来模拟上图中的树的结构&#xff0c;逻辑上和上图结构一致。 …...

NLTK分词以及处理方法

在自然语言处理(NLP)的领域中,文本的处理是一个基础且核心的环节,特别是在大规模数据分析和文本挖掘中。无论是聊天机器人、情感分析,还是机器翻译,分词都是必不可少的步骤之一。分词的目的是将长篇的文本拆解为较小的单位(如单词或句子),这些单位是后续分析和处理的基…...

wordpress投票插件/西安网络科技公司排名

键盘脏一些也未必全无好处&#xff0c;可以借机研究一下按键频度。键盘特写&#xff0c;哪个键用的多&#xff0c;哪个键按的少&#xff0c;一目了然。 A到Z二十六个字母键&#xff0c;上下左右光标键&#xff0c;全部光秃秃的&#xff0c;可见使用频率很高&#xff1b;周边的回…...

沧州网站建设制作设计优化/天津抖音seo

-- -- Oracle 常见故障及日常规划 -- 对任何数据库系统而言&#xff0c;对显而易见的故障&#xff0c;应当避免发生本文列出了Oracle常见的故障并给出了解决方案&#xff0c;同时列出了一些日常规划。 一、数据库高可用性的几个目标 MTBF(Mean-Time-Between-Failures) 平均失败…...

轻量级服务器wordpress/教育培训网站模板

1 问题定位 windows下面无问题&#xff0c;在linux下面出现问题&#xff0c;中文变成方框&#xff0c;经过排查发现linux下缺少字体&#xff0c;只需将widows字体上传到linux服务器进行配置加载就好 2 解决方案 2.1 方案一 2.1.1 安装字体库 [rootlocalhost ~]# yum -y inst…...

网站建设方案合同/哪个公司的网站制作

目录1 池场景1.1 在运行时创建场景1.2 把对象放入场景池1.3 从重编译中恢复2 关卡12.1 多场景编辑2.2 场景灯光2.3 在构建中包含多场景2.4 加载场景2.5 等待下一帧2.6 烘焙环境光2.7 异步加载2.8 阻止双重加载3 更多的关卡3.1 level23.2 检查加载的关卡3.3 加载特殊的关卡3.4 选…...

做网站推广员必备的条件/百度搜一搜

问&#xff1a;从北京邮电大学毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;想要了解北京邮电大学毕业生就业具体情况详见>>>北京邮电大学总之&#xff0c;北京邮电大学就业率相对来说是比较良好的&#xff0c;如果大家对此学校感兴趣的话&#xff0c;可…...

动态网站搭建方案/google下载安装

目前接触到一个需求&#xff0c;需要全球主要国家的选择以及语言的选择&#xff0c;如下图&#xff1a; 这是国家选项 这是语言的选项&#xff1a; 很简单有木有&#xff1f; 本来打算直接给文件&#xff0c;但是好像没有文件上传&#xff0c;所以就提供一个思路和代码&#xf…...