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

炒股网站开发/百度网站搜索排名

炒股网站开发,百度网站搜索排名,网络公司最怕怎么投诉,深圳手机网站建设公司好的,我们继续,这是 C专栏的第二篇博客,还没读过上一篇博客可以进入我创建的专栏阅读 入门C(上)再回来哦~ 下面我们要讲的第一个概念就是函数重载 函数重载 1. 函数重载概念 什么是函数重载? 简单来说…

好的,我们继续,这是 C++专栏的第二篇博客,还没读过上一篇博客可以进入我创建的专栏阅读

入门C++(上)再回来哦~

下面我们要讲的第一个概念就是函数重载

函数重载

1. 函数重载概念

什么是函数重载?   简单来说,函数重载就是一词多义 下面给出它的详细定义

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

注意:不同作用域可以随便同名
           同一作用域要同名,则需要满足重载的规则

下面我们来看一下几个构成函数重载的例子:

1.参数个数不同

2.参数类型不同

3.参数类型顺序不同

然后我们再来看一下下面的代码:

为什么这里会报错?

可以肯定的是这是不需要重载关系也是ok的(因为不同作用域可以随便同名)  

  但是在这里发生了调用歧义 所以才会报错~

再看一个例子:

这里的函数虽然构成重载,但是它们的调用会有歧义

我们再看一个例子:
 

这里我们可以得出:返回值不同是无法构成重载的

因为返回值不同,无法区分,所以返回值不是重载的条件

综上所属,调用里面中有歧义的都是不行的

最后,关于函数的重载,我们需要记住,它一定是和形参的类型是有关系的

还有就是将调用歧义和函数重载 区分开来 

2.C++支持函数重载的原理

所以为什么C++支持函数重载,而C语言不支持函数重载呢?

在这里简单介绍一下:

对于C语言不支持函数重载我们是可以很好理解的,这与之前我们在C语言中讲过的编译链接过程有关 :一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

链接时:

1.C语言是直接用函数名字去查找函数的地址的,所以不支持函数重载

2.在C++中,是用修饰后的函数名字去查找的,只要参数不同,修饰出来的名字就不一样,所以就支持函数重载

但是在如果我们在调用时不指定返回值类型,那么我们并不知道调函数的哪个返回值,就是调用时有了歧义,无法区分

所以对于C++的函数重载而言,函数返回值不同并不能构成函数重载,因为这不是函数名修饰规则

这也印证了我们在之前说的函数重载与 参数个数 或 类型 或 类型顺序 三者有关



接下来我们来看一下引用

引用

1. 引用概念

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

引用的形式:  类型 & 引用变量名 = 引用实体

举个例子:

注意:引用类型必须和引用实体是同种类型的
 

2. 引用特性

1.引用在定义时必须初始化

2.一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

对于第一个特性,其实很好理解,我们看下面的这行代码

int& a; // 该条语句编译时会出错

对于这里的第二个特性,可以看下面的代码:

我们发现,这里的a,b,c,d都是同一个东西

然后是第三个特性,我们看下面的代码:

int main()
{int x = 0;int& y = x;int z = 1;y = z;return 0;
}

这里是  y变成z的别名呢?   还是z赋值给y?

根据引用的第三个特性:引用一旦引用一个实体,再不能引用其他实体

所以这里的代码y = z 意思是将  z赋值给y

我们可以验证一下:

3. 常引用

我们来看一下下面的代码:

	const int a = 10;int& ra = a; 

该语句编译时会出错,

因为a经过const修饰后是只读的
而ra变成a的别名,ra的权限是可读可写的

这是一种权限的放大,即原来 只是可读的变成的 可读可写的 所以不可以

总之,这里我们需要知道,权限不能放大
 

再看下面的代码:


const int* p1 = &m;
int* p2 = p1;

该语句编译时也会出错,这也是权限的放大
因为 const修饰是的*p1 , 所以 p1可以修改 *p1不可以

而int* p2 = p1 ,如果我们改变*p2,那么*p1就也会被修改,所以不可以

对应的,我们可以将 int* p2 = p1 修改为 const int& p2 = p1 这样就是权限的平移,是可以的

再看一个代码:

	int* p1 = &x;const int* p2 = p1;

这是可以的,

p1是可读可写的,p2只可读

这是一种权限的缩小,即原来可读可写的变成了只可读  所以可以

这里我们可以知道,权限可以缩小

看下面代码:

double d = 12.34;
int& rd = d; 

int& rd = d;  该语句编译时会出错,这是为什么呢?仅仅因为类型不同吗?

可是如果我换成 const int& rd = d 就不会报错,这又是为什么呢?

这里其实会进行一个类型的转换,而类型转换又会生成临时变量

知道了这点,我们就可以分析其中的原因了,int& rd = d 这里要将d给rd,这里是要类型转换的,而类型转换又需要临时变量,所以其实rd引用的不是d,而是那个临时变量

我们还知道,临时变量具有常性(相当与const修饰),所以这里的int& rd = d存在权限的放大

而我们将nt& rd = d 改成 const int& rd = d ,就不会是权限的放大,而是权限的平移,所以可以

总结一下,权限可以缩小,可以平移,但绝不可以放大!

4.使用场景

做参数

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

这里我们用引用的话就不用像C语言那样去传指针了,就会变得更加的方便~

而关于做返回值的使用场景,我们暂且不讲,留到以后讲类和对象时再说~
 

5. 传值、传引用效率比较

下面我们用一段代码看一下传值和传引用效率上的区别:

#include <time.h>
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;
}

(Tips:第二个函数运行的时间为0是取整后的结果,表示运行时间不超过1ms)

通过上述代码的比较,我们由此发现传值和指针在作为传参上效率相差很大

我们也能感知到引用传参的一个极大的好处
 

6.引用和指针的区别
 

讲到这里,引用的知识差不多就介绍完了,最后我们来简单的对比一下:
 

引用和指针的不同点:

1. 在语法上,我们认为引用定义一个变量的别名,指针存储一个变量地址

所以在语法层面上,我们认为引用不开空间(比如:int & b = a;),而指针是要开空间的

(比如: int * p   =  &a;)     (但是在底层,其实它们是一样的,都是指针)

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

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

4. 没有NULL引用,但有NULL指针(但这个也不是绝对的,比如说    int* ptr = NULL;
    int& r = *ptr; 这里看起来对空指针解引用,但是不会报错,因为在底层其实只是存ptr的地址,没有解引用,不过如果我们接下来要访问 :cout<< r<<endl; 才会解引用)

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节,64位平台下占8个字节)

比如我们看下面的代码及运行结果:

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

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

8. 访问实体方式不同,指针需要显式解引用,引用 是编译器自己处理(因为引用底层也是指针,但是它解引用不需要显式处理)

9. 引用比指针使用起来相对更安全(所以在C++我们更倾向用引用)
 

结语

好啦,这篇C++入门中篇的博客就先写到这里吧 我们介绍了C语言没有的两个新的概念:函数重载和引用,希望大家能有所收获~

如果文中分析,题解代码有不足的地方欢迎大家在评论区讨论和指正

接下来我也会持续更新与C++相关内容的博客

让我们在接下来的时间里一起学习,一起进步吧~

相关文章:

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

好的&#xff0c;我们继续&#xff0c;这是 C专栏的第二篇博客&#xff0c;还没读过上一篇博客可以进入我创建的专栏阅读 入门C&#xff08;上&#xff09;再回来哦~ 下面我们要讲的第一个概念就是函数重载 函数重载 1. 函数重载概念 什么是函数重载&#xff1f; 简单来说…...

javaIO

file类 一个File类的对象可以表示一个具体的文件或目录 mkdir 创建单级文件夹 mkdirs 创建多级文件夹 delete 删除一个文件夹时&#xff0c;文件夹里面必须是空的 listfiles 将文件夹的子集放到一个file类型的数组中 输入及输出的概念 输入input 输出output 把jav…...

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用

机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台&#xff0c;产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案&#xff0c;让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…...

用JSch实现远程传输文件并打包成jar

本文将简单介绍一下 JSch 这个Java的第三方库的一个简单用法&#xff0c;并以此为实例&#xff0c;讲解 IntelliJ 中打包成 jar 包的2种方式。 实现目标 我们的目标是&#xff0c;做出一个jar包&#xff0c;它能够实现类似于 scp 命令的远程传输文件的功能。用法如下&#xf…...

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …...

力扣刷题Days28-第二题-11.盛水最多的容器(js)

目录 1&#xff0c;题目 2&#xff0c;代码 3&#xff0c;学习与总结 3.1思路回顾 1&#xff0c;如何遍历 2&#xff0c;算法流程 3.2剖析问题 1&#xff0c;题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, h…...

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有&#xff1a; 文生图大模型&#xff1a;如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型&#xff1a;如CLIP、Chinese CLIP、…...

算法学习——LeetCode力扣动态规划篇10(583. 两个字符串的删除操作、72. 编辑距离、647. 回文子串、516. 最长回文子序列)

算法学习——LeetCode力扣动态规划篇10 583. 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个…...

TASKPROMPTER

baseline模型的预训练权重就有1.6G! 多吓人呐&#xff0c;当时我就暂停下载了&#xff0c;不建议复现...

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…...

等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)

层面 控制点 要求项 安全问题 适用范围 充分条件 整改建议简要 安全物理环境 基础设施位置 应保证云计算基础设施位于中国境内 1.云计算基础设施物理位置不当 二级及以上 相关基础设施不在中国境内 云平台相关基础设施在中国境内部署 安全通信网络 网络架构 应…...

JavaScript笔记 09

目录 01 DOM操作事件的体验 02 获取元素对象的五种方式 03 事件中this指向问题 04循环绑定事件 05 DOM节点对象的常用操作 06 点亮盒子的案例 07 节点访问关系 08 设置和获取节点内容的属性 09 以上内容的小总结 01 DOM操作事件的体验 js本身是受事件驱动的脚本语言 什…...

操作教程|在MeterSphere中通过SSH登录服务器的两种方法

MeterSphere开源持续测试平台拥有非常强大的插件集成机制&#xff0c;用户可以通过插件实现平台能力的拓展&#xff0c;借助插件或脚本实现多种功能。在测试过程中&#xff0c;测试人员有时需要通过SSH协议登录至服务器&#xff0c;以获取某些配置文件和日志文件&#xff0c;或…...

Swashbuckle.AspNetCore介绍

使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由、控制器和模型生成精美的 API 文档&#xff0c;包括用于探索和测试操作的 UI。 除了 Swagger 2.0 和 OpenAPI 3.0 生成器外&#xff0c;Swashbuckle 还提供了由生成的 Swagger JSON 提供支持的令人敬畏的 swagg…...

【Spring】通过Spring收集自定义注解标识的方法

文章目录 前言1. 声明注解2. 使用 Spring 的工厂拓展3. 收集策略4. 完整的代码后记 前言 需求&#xff1a; 用key找到对应的方法实现。使用注解的形式增量开发。 MyComponent public class Sample1 {MyMethod(key "key1")public String test2() {return "She…...

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…...

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…...

通过一篇文章让你完全掌握VS和电脑常用快捷键的使用方法

VS常用快捷键 前言一、 VS常用快捷键常用VS运行调试程序快捷键常用VS编辑程序快捷键 二、常用windows系统操作快捷键 前言 VS&#xff08;Visual Studio&#xff09;是一款强大的开发工具&#xff0c;提供了许多常用快捷键&#xff0c;以提高开发效率。这些快捷键包括文件操作…...

ChatGPT指引:借助ChatGPT撰写学术论文的技巧

ChatGPT无限次数:点击直达 ChatGPT指引&#xff1a;借助ChatGPT撰写学术论文的技巧 在当今信息技术高度发达的时代&#xff0c;人工智能技术的不断发展为学术研究者提供了更多的便利和可能。其中&#xff0c;自然语言处理技术中的ChatGPT无疑是一种强大的工具&#xff0c;它能…...

魔改一个过游戏保护的CE

csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中&#xff0c;很多游戏有保护&#xff0c;我们运行原版CE的时候会被检测到 比如我们开着CE运…...

rust嵌入式开发之await

嵌入式经常有类似通过串口发送指令然后等待响应再做出进一步反应的需求。比如&#xff0c;通过串口以AT命令来操作蓝牙模块执行扫描、连接&#xff0c;需要根据实际情况进行操作&#xff0c;复杂的可能需要执行7、8条指令才能完成连接。 对于这样的需求&#xff0c;如果用异步…...

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…...

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…...

python-pytorch获取FashionMNIST实际图片标签数据集

在查看pytorch官方文档的时候&#xff0c;在这里链接中https://pytorch.org/tutorials/beginner/basics/data_tutorial.html的Creating a Custom Dataset for your files章节&#xff0c;有提到要自定义数据集&#xff0c;需要用到实际的图片和标签。 在网上找了半天没找到&a…...

深入探秘Python生成器:揭开神秘的面纱

一、问题起源&#xff1a; 想象一下&#xff0c;您掌握了一种魔法&#xff0c;在代码世界里&#xff0c;您可以轻松呼唤出一个整数。然而&#xff0c;事情并不总是看起来那样简单。在Python的奇妙王国中&#xff0c;我遇到了一个有趣的谜题&#xff1a; def tst():try:print(…...

红队攻防渗透技术实战流程:红队目标信息收集之批量信息收集

红队资产信息收集 1. 自动化信息收集1.1 自动化信息收集工具1.2 自动域名转换IP工具1.3 自动企业信息查询工具1.4 APP敏感信息扫描工具1.5 自动化信息工具的使用1.5.1 资产灯塔系统(ARL)1.5.1.1 docker环境安装1.2.2.9.1 水泽-信息收集自动化工具1. 自动化信息收集 1.1 自动化…...

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”&#xff0c;组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…...

若依框架学习使用

若依官网项目拉取下来介绍 | RuoYi 项目运行&#xff1a; 1.idea安装&#xff0c;可以运行前后端 编辑器idea、jdk环境安装、数据库mysql、navicat工具、redis(redis-server启动)安装 2.navicat数据库连接, 创建数据库ry-vue并导入数据脚本ry_2021xxxx.sql&#xff0c;qua…...

蓝桥杯_数学模板

1.试除法判定质数 #include <iostream> using namespace std;bool is_zs(int x) {if(x<2) return false;for(int i2;i<x/i;i)if(x%i0)return false;return true; }int main() {int n; cin>>n;while(n--){int x; cin>>x;if(is_zs(x)) cout<<&quo…...

稀碎从零算法笔记Day31-LeetCode:接雨水

半月一去&#xff0c;望舒一轮&#xff0c;明天开始攻坚哈德题了 前言&#xff1a;非常经典的一道笔试题&#xff0c;看了保证血赚&#xff08;今天银泰星笔试第四题就是这个&#xff09; 题型&#xff1a;dp、模拟、双指针…… 链接&#xff1a;42. 接雨水 - 力扣&#xff…...