C++的缺省参数,函数重载,引用

目录

1、缺省参数(不能在函数声明和定义中同时出现,若声明和定义是分开的,则缺省参数放在声明里面)

1.1、缺省参数的概念

1.2、全缺省

1.3、半缺省

2、函数重载

2.1、特殊情况

2.2、特殊情况

2.3、为什么C++支持函数重载而C语言不支持(10_12_1:40)

3、引用

3.1、概念:

3.2、引用就是取别名,别名变原名也变

3.3、引用的传参(核心)

3.4、C++引用的几种错误写法

3.4.1、引用必须初始化

3.4.2、C++中的引用初始化后,就不能第二次改变引用的指向:

3.5、引用作为返回值

3.5.1、错误的使用,这种直接返回的值是不确定的

3.5.2、正确使用,将要返回的变量设置为静态变量;

3.5.3、引用做返回值的价值


1、缺省参数(不能在函数声明和定义中同时出现,若声明和定义是分开的,则缺省参数放在声明里面)

1.1、缺省参数的概念

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值(缺省值只能为常量或者全全局变量) 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

1.2、全缺省

即所有参数都给定默认值,如下:

1.3、半缺省

即只有部分参数指定默认值,但缺省值必须从右往左连续给定,即没有默认值的参数必须放在最左边:

2、函数重载

即运行函数名相同,根据参数列表(包括参数个数,参数类型,类型顺序)的不同,调用对应的函数。

注意:紧靠返回值不同不能构成重载,返回值不参与重载。

2.1、特殊情况

这种情况理论上说是可以的,因为整形和浮点型之间存在隐式类型转换,但由于我重载函数中既有整形参数又有浮点型参数,就不知道谁转换成谁,就产生了二义性。

2.2、特殊情况

当重载和缺省参数相遇时,如下:

这样可以构成重载函数,但因为缺省参数的存在,导致他不知道该调用哪个函数,产生二义性;

2.3、为什么C++支持函数重载而C语言不支持(10_12_1:40)

3、引用

3.1、概念:

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

3.2、引用就是取别名,别名变原名也变

3.3、引用的传参(核心)

我们以交换两个数的功能为例:
//C语言写法
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//C++写法
void Swap(int& p1, int& p2)
{
	int tmp = p1;
	p1 = p2;
	p2 = tmp;
}

int main()
{
	int a = 0, b = 1;
	//C语言传参
	Swap(&a, &b);
	//C++传参
	Swap(a, b);
	return 0;
}

3.4、C++引用的几种错误写法

3.4.1、引用必须初始化

3.4.2、C++中的引用初始化后,就不能第二次改变引用的指向:
int main()
{
	int a = 0;
	int& c = a;
	int d = 1;
	//下面这一步是赋值,执行过后a和c的值都为1
	//而不是c变成d的引用
	c = d;
	return 0;
}

所以C++中的引用并不能完全替代指针,例如不适合链表的插入结点操作,指针域如果是个引用就不能改变指向

3.5、引用作为返回值

3.5.1、错误的使用,这种直接返回的值是不确定的

因为出了作用域,对象就会被销毁,n空间处的数据可能会被摧毁也有可能保存,所以会是个不确定的值。

3.5.2、正确使用,将要返回的变量设置为静态变量;

由于变量c是静态变量,定义在静态区,这样函数test的栈帧的销毁就不影响c,而b就是c的引用,所以可以这样使用。又由于静态变量只能初始化一次,所以下面第二次调用test函数也不会影响c的值,即不会影响引用b的值。如果是下面这种情况就会影响其值:

3.5.3、引用做返回值的价值

(1)、可以提高效率;

(2)、可以修改返回对象;

3.6、常引用

3.6.1、如下:

a被const修饰成常变量,此时不能直接给a取别名b,因为别名是可以改变值的。

此时想给a取引用,也需要再引用前面加const:

3.6.2、如下:

3.6.3、根据3.6.1,我们发现一个神奇的现象

整形可以赋值给浮点型,此时是发生类型转换;

但是整形不能直接取一个double型的别名;

但是如果在double前加一个const就可以给整形取别名了,如下:

原因就在于:

不管是强制类型转换还是隐式类型转换,在转换过程中都会产生一个中间变量,整形i先赋值给该中间变量,然后中间变量才赋值给浮点型r,最关键的是该中间变量具有常属性,所以需要用常引用(前面加const)来个整形取别名。

3.7、引用和指针的区别

(1)、语法上:

语法上,引用没有开新空间,只是变量的别名,与变量共用一份空间;

语法上,指针开了新空间;

(2)、底层:

底层,引用开了空间并且用指针实现,引用的底层是汇编实现的。

(3)、 引用 在定义时 必须初始化 ,指针没有要求
(4)、 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何一个同类型实体。
(5)、 没有 NULL 引用 ,但有 NULL 指针
(6)、 sizeof 中含义不同 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32位平台下占4 个字节 )。
(7)、引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小。
(8)、有多级指针,但是没有多级引用。
(9)、访问实体方式不同, 指针需要显式解引用,引用编译器自己处理。
(10)、引用比指针使用起来相对更安全。

//未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、C语言中的数组:二维数组

四、C语言中的数组:二维数组 本章的学习内容如下: 四、C语言中的数组:数组的创建与初始化 四、C语言中的数组:数组的输入与元素个数 C语言—第6次作业—十道代码题掌握一维数组 四、C语言中的数组:二维数组 我们可以…

学习SpringBoot笔记--知识点(2)

目录 数据访问 基础特性 自定义banner Profiles Profiles组件 Profiles配置文件 外部化配置 单元测试 数据访问 整合SSM场景 SpringBoot 整合 Spring&#xff0c;SpringMVC&#xff0c;MyBatis 进行数据访问场景开发 需要的依赖&#xff1a; <!-- web启动…

遇到了问题,Firepower 2140配置带外IP时报错 commit-buffer failed

onsite we have a cisco firepower 2140 device which run ASA as we try to modify the 2140 OOB mgmt ip by CLI, we got an error why ? 经过查询发现&#xff0c;需要进入ASA里面打上以下这条命令&#xff0c;并重启ASA 1 修改模式并重启 ciscoasa# configure termina…

注册、配置中心-微服务小白入门(2)

Nacos 已经下载安装并且使用了&#xff0c;那么看如何使用&#xff1a; Nacos 注册及配置&#xff0c;以下是一个服务启动后注册到nacos&#xff0c;同时&#xff0c;把该服务的相关配置&#xff0c;写到nacos之中 1、nacos设置 命名空间中&#xff0c;添加对应的服务命名空间…

agent利用知识来做规划:《KnowAgent: Knowledge-Augmented Planning for LLM-Based Agents》笔记

文章目录 简介KnowAgent思路准备知识Action Knowledge的定义Planning Path Generation with Action KnowledgePlanning Path Refinement via Knowledgeable Self-LearningKnowAgent的实验结果 总结参考资料 简介 《KnowAgent: Knowledge-Augmented Planning for LLM-Based Age…

CharacterController.Move called on inactive controller

【问题背景】 Unity3D中开发物体的移动&#xff0c;实现代码如下&#xff1a; public class TargetController : MonoBehaviour {private CharacterController character;private float speedRate 4f;private void Start(){character GetComponent<CharacterController&…

第十二届蓝桥杯JavaB组省赛真题 - 时间显示

解题思路&#xff1a; 数量级较大&#xff0c;需要使用long类型 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long num scan.nextLong();long allseconds num / 1000;long seconds allse…

ROS机器人入门第四课:话题通信

文章目录 ROS机器人入门第四课&#xff1a;话题通信一、话题通信概述&#xff08;一&#xff09;概念&#xff08;二&#xff09;作用 二、话题通信基本操作需求:分析:流程:&#xff08;一&#xff09;发布方解释一些关键的ROS函数和概念&#xff1a; &#xff08;二&#xff0…

如何使用WordPress插件保护网站的安全

前段时间我们的网站受到了黑客的攻击&#xff0c;网站丢失了一些重要的数据&#xff0c;为了防止这种情况的再次发生&#xff0c;我们准备将网站全部迁移到高防服务器&#xff0c;经过一番对比后&#xff0c;我们选择了Hostease提供的高防服务器。它可以有效地抵御各种类型的网…

网络七层模型:理解网络通信的架构(〇)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

开箱即用的中后台管理模版,建议收藏!

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文作者&#xff1a;前端充电宝 大家好&#xff0c;我是白特。 今天来推荐几款开箱即用的中后台管理模版&#xff01; Vue Element Admin vue-element-admin 是一个后台前端解决方案&#xff0c;它基于 vue 和 …

WMS仓储管理系统如何优化供应链管理

随着信息技术的快速发展和市场竞争的加剧&#xff0c;优化供应链管理已成为企业提升竞争力的关键。WMS仓储管理系统作为供应链管理的核心工具&#xff0c;其在优化供应链过程中的作用日益凸显。本文将深入探讨WMS仓储管理系统如何优化供应链管理。 首先&#xff0c;WMS仓储管理…

pdfjs 实现给定pdf数据切片高亮并且跳转

pdfjs 实现给定pdf数据切片高亮并且跳转 pdfjs 类的改写基本展示需求的实现高亮功能的实现查询功能分析切片数据处理 pdfjs 类的改写 需求&#xff1a; pdf文件被解析成多个分段&#xff0c;每个分段需要能够展示&#xff0c;并且通过点击分段实现源pdf内容的高亮以及跳转需求…

Oracle数据库入门第三课(函数)

前面二白讲了一些简单的查询语句&#xff0c;仅仅知道查询语句的语法是不够的&#xff0c;要想实现更多的需求&#xff0c;更重要的是函数的使用&#xff0c;这节课我们简单说一下一些函数的使用。 一、函数的分类 什么叫做函数? 函数就是用来实现某种功能的,提前声明好的代…

微博修改密码后无法通过微博开放接口发送微博

生产环境&#xff0c;因密码修改导致授权失效致接口发送微博失效&#xff01;内部网站编辑完博文后无法发送微博。在修改密码时&#xff0c;有提示授权应用失效&#xff0c;操作人员不清晰情况&#xff0c;直接忽视。 微博应用开放接口----》微博转发博文接口文档 无示例 遗憾…

淘宝API接口推荐:淘宝app商品详情数据接口

淘宝的商品详情API接口是一种技术工具&#xff0c;它允许开发者通过编程的方式获取淘宝平台上商品的详情页面的数据。这些数据对于电商智能决策至关重要&#xff0c;因为它们可以提供关于消费者偏好、商品质量和市场趋势的宝贵信息。 淘宝天猫API列表 item_get 获得商品详情i…

多线程死锁,java内存模型,wait、notify方法

死锁出现的第一种情况 可重入 同一个线程针对同一个锁连续继续加锁多次的行为。如果发生了死锁情况&#xff0c;那就是发生了不可重入&#xff0c;反之不会发生死锁&#xff0c;就是可重入的。 当进行多次加锁会发生什么情况 在这个方法中实现了在外面对方法的加锁&#xff08;…

操作系统的理解|冯·若依曼体系结构|进程的状态

操作系统的理解 冯诺伊曼体系结构为什么必须通过内存然后到cpu存储金字塔冯诺伊曼结构的改进在哪&#xff1f;我们可不可以全部用寄存器来做存储器在硬件数据流动角度学以致用&#xff1a;解释程序运行为什么要加载到内存程序没被运行之前存在哪里&#xff1f; 操作系统概念广义…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法

下载安装Anaconda 首先需要下载Anaconda&#xff0c;可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章&#xff1a;Anaconda安装步骤&#xff0c;本篇不再赘述 注意环境变量的配置&#xff0c;安装好Anaconda之后一定要在环境变量…