初始C++之缺省参数 函数重载 引用

初始C++之缺省参数 函数重载 引用&

文章目录

  • 初始C++之缺省参数 函数重载 引用&
    • 一、缺省参数
      • 1.1 缺省参数的定义
      • 1.2 缺省参数的分类
      • 1.3 注意事项
    • 二、 函数重载
      • 2.1 函数重载的定义
      • 2.2 参数个数不同
      • 2.3 参数类型不同
      • 2.4 类型顺序不同
      • 2.5 为什么C语言不支持函数重载
    • 三、引用 &
      • 3.1 引用的定义
      • 3.2 引用的特性
      • 3.3 引用的权限
      • 3.4 引用和指针的区别

一、缺省参数

1.1 缺省参数的定义

定义:缺省参数是指在声明或定义函数时,给函数参数指定一个缺省值,再调用函数时,如果没有指定实参,则采用形参的缺省值,否则则使用指定的实参

示例:

void Func1(int a = 10)
{
	cout << a << endl;
}

int main()
{
	Func1();//不指定传参,则打印缺省值

	Func1(100);//指定传参,打印指定值

	return 0;
}

代码运行结果:

10
100

1.2 缺省参数的分类

• 半缺省参数

半缺省参数:指的是在函数的声明或定义中,只有部分参数指定了缺省值

示例:

void Func2(int a,int b = 20,int c = 30)
{
	cout <<"a = " << a << endl;
	cout <<"b = " << b << endl;
	cout <<"c = " << c << endl;
}

int main()
{
	Func2(50);//半缺省参数,指指定a的值
	
	return 0;
}

• 全缺省参数

全缺省参数:指的是在函数的声明或定义中,给所有参数都指定了缺省值

示例:

void Func3(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
int main()
{
	Func3();//不指定值,打印缺省值

	return 0;
}

1.3 注意事项

1. 缺省参数只能从左往右给,不能间隔的给
2. 缺省参数不能在函数定义或函数声明中同时出现(如果同时出现两个不同的缺省值,编译器不知道该使用哪一个)
3. 缺省值必须是常量或者全局变量
4. C语言不支持缺省参数(编译器不支持)

二、 函数重载

2.1 函数重载的定义

函数重载:是函数的一种特殊情况,在C++中,同一个作用域内,可以声明几个功能类似的同名函数,这些函数的参数列表(参数个数,类型,类型顺序)不同

2.2 参数个数不同

#include <iostream>
using namespace std;

void Func()
{
	cout << "Func()" << endl;
}

void Func(int a)
{
	cout << "Func(int a)" << endl;
}
int main()
{
	Func();
	Func(10);
	
	return 0;
}

2.3 参数类型不同

#include <iostream>
using namespace std;

// 1. 参数类型不一样
void Swap(int* px, int* py)
{
	int tmp = *px;
	*px = *py;
	*py = tmp;

	cout << "Swap(int* px, int* py)" << endl;
	cout << "a = " << *px << "b = " << *py << endl;
}

void Swap(double* px, double* py)
{
	double tmp = *px;
	*px = *py;
	*py = tmp;

	cout << "Swap(double* px, double* py)" << endl;
	cout << "a = " << *px << "b = " << *py << endl;
}
int main()
{
	int a = 10, b = 20;
	double c = 10.6,d = 30.5;
	Swap(&a,&b);
	Swap(&c,&d);
	
	return 0;
}

2.4 类型顺序不同

void f(int a, char b)
{
	cout << "f(int a, char b)" << endl;
}
void f(char a, int b)
{
	cout << "f(char a, int b)" << endl;
}
int main()
{
	f(10, 'a');
	f('a', 10);

	return 0;
}

2.5 为什么C语言不支持函数重载

在函数定义和声明分离的情况下,在经过编译之后,在链接的时候,编译器会通过函数名来找到函数的地址,而函数的地址,在函数定义中的第一句指令的地址(类似与数组的地址是数组第一个元素的地址),在C语言中,链接时,是直接通过函数名来查找函数的地址的,比如有一个Add(int a,int b)函数,不同的编译器有不同的函数名修饰规则,假设是直接使用Add这个函数名来找到他的定义,所以C语言不支持重载,而在C++中会使用修饰之后的函数名查找,假设是 _Z3Addii 来查找,由于参数列表的不同,可以区分出不同的重载函数,所以C++中支持函数重载

简单来说就是,C语言是直接通过函数名来查找,所以不支持重载
而C++中是通过修饰后的函数名来查找(不同参数列表修饰出来的名字不同),可以区分出来,所以支持重载

三、引用 &

3.1 引用的定义

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

示例:

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;
	int& c = a;
	int& d = c;

	cout << a << " " << b << " " << c << endl;
	return 0;
}

代码运行结果:

10 10 10 10
引用的地址和值是和被引用变量一致的
在这里插入图片描述

3.2 引用的特性

TIPS:
1. 引用变量必须初始化
2. 一个变量可以有多个引用
3. 引用一旦指定一个变量,就不能改变
4. 引用必须和引用的变量是同一类型的

示例1:引用变量必须初始化

#include <iostream>
using namespace std;

int main()
{
	int& a;
	return 0;
}

在这里插入图片描述

示例2:一个变量可以有多个引用

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;
	int& c = a;

	return 0;
}

示例3:引用一旦指定一个变量,就不能改变

#include <iostream>
using namespace std;

int main()
{
	int x = 10;
	int y = 20;
	int& b = x;
	b = y; //不是b变成y的别名 而是y给b赋值,由于b是x的别名,同时x值也改变了
	cout << x << endl; 
	return 0;
}

代码运行结果:
20

示例4:引用必须和引用的变量是同一类型的

#include <iostream>
using namespace std;

int main()
{
	int x = 10;
	double& y = x;
	return 0;
}

在这里插入图片描述

3.3 引用的权限

  1. 权限的平移
#include <iostream>
using namespace std;

int main()
{
	int x = 10;
	int& y = x;
	
	return 0;
}
  1. 权限的缩小
#include <iostream>
using namespace std;

int main()
{
	int x = 10;  
	const int& y = x;//从可以修改变成了只读
	
	return 0;
}
  1. 权限的放大
#include <iostream>
using namespace std;

int main()
{
	const int x = 10;
	int& y = x; //x只读,y变成x的别名,x变成了可读可写
	//权限的放大 不可以
	return 0;
}

3.4 引用和指针的区别

  1. 引用实际上是一个变量的别名,指针是存放一个变量的地址
  2. 引用必须初始化,指针可以不初始化
  3. 在语法上,引用不开辟空间,指针有开辟空间(从底层来看,引用实际上是有开空间的)
  4. 引用在引用了一个变量之后,不能再引用其他变量,指针在指向了一个变量,还可以更改指向,指向其他变量
  5. 没有NULL引用,但是有NULL指针
  6. sizeof计算大小时,引用占用为引用变量的类型的大小,指针则是固定4个字节(32位平台下)或 8个字节(64位平台下)
  7. 没有多级引用,有多级指针
  8. 引用指针用起来相对安全

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

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

相关文章

Python中的错误处理 - 使用try、except、else和finally进行解释,并附带代码示例

最近&#xff0c;我的经理委派我创建一个自动报告。我设计的报告非常简单。它包括一些来自数据库的数字和一些基本的数学运算。我很兴奋最终可以向公司展示我的惊人的Python技能。 我完成并交付了产品。一切都很顺利。至少&#xff0c;直到大约两周后。我的报告由于除以零错误…

编程新手必看,python中条件控制语句学习(13)

介绍&#xff1a; Python3中的条件控制主要通过if、elif和else关键字来实现&#xff0c;它们用于根据条件执行特定的代码块。 if语句&#xff1a;这是最基本的条件控制结构。如果满足某个条件&#xff08;条件为True&#xff09;&#xff0c;则执行相应的代码块。在Python中&am…

蓝牙app设计(方案二) E4A (时钟 优缺点)

例程改的! 主界面 虽然上面有搜索功能,但是本人建议先自行配对在使用,这样更好用,把要使用的设备收藏一下更好找哦(这样就是橙色的了,只需要点对应蓝牙左边) 代码修改部分 原版是不停向下滚动显示,这样个人觉得不太好看,所以加了个时钟,到对应时钟周期清空(达到刷…

Java-Web过滤器

文章目录 1.基本介绍1.为什么需要过滤器&#xff1f;2.基本介绍3.过滤器的基本原理 2.快速入门1.文件目录2.环境配置创建maven项目&#xff0c;导入依赖 3.代码实现1.login.jsp2.LoginCheck.java3.ManagerFilter.java编写过滤规则4.配置web.xml告诉tomcat5.admin.jsp 3.Filter的…

【nodejs基础学习三-浏览器偏好设置】

系列文章目录 第一章 nodejs基础学习–注释、变量、运算符、字符串、函数&#xff08;一&#xff09; 第二章 nodejs基础学习–循环、对象字符、模块导入出&#xff08;二&#xff09; 第三章 nodejs基础学习三-浏览器设置 系列文章目录一、开发者模式二、web偏好设置 一、开发…

【病毒分析】DevicData勒索病毒分析

1.背景 1.1来源 近期&#xff0c;Solar团队收到某医疗单位的援助请求&#xff0c;该公司的计算机受到了某勒索病毒的侵害&#xff0c;所有的文件被加密并且添加了.DevicData-P-470b1abd后缀&#xff0c;我司人员现场取证进行排查并提取加密器,本文是对于加密器的分析。 2.恶…

MySQL高级详解

文章目录 约束概述分类主键约束概述特点定义及删除主键自增 唯一约束作用语法 非空约束作用语法 面试题&#xff1a;非空唯一约束与主键约束有什么区别默认值约束作用语法 总结 表关系及外键约束表关系概述分类一对多关系表设计外键字段设计原则 多对多关系表设定设计原则 一对…

Linux下网络编程基础知识--协议

网络基础 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 协议 一组规则, 数据传输和数据的解释的规则。 比如说依次发送文件的文件名, 文件的大小, 以及实际的文件, 这样规定发送一个文件的顺序以及发送的每一个部分的格式等可以算是一种协议 型协议 …

探索ChatGPT-Plus:AI 助手全套开源解决方案

探索ChatGPT-Plus&#xff1a;AI 助手全套开源解决方案 ChatGPT-plus是一种新型的对话生成模型&#xff0c;它是在OpenAI的ChatGPT基础上进行了改进和优化的版本。ChatGPT-plus的出现引起了广泛关注&#xff0c;因为它在对话生成方面展现出了更加出色的表现和能力。在本文中&am…

【C++第三阶段】stackqueue容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 stack容器queue容器 stack容器 是什么&#xff1f;功能是什么&#xff1f;常用接口是什么&#xff1f;局限性有哪些&#xff1f;优势又有哪些&#xff1f; 栈容器&#xff0c;先进…

智能驾驶“血拼”端到端,元戎启行准备好了吗?

智能驾驶从规则驱动转向数据驱动&#xff0c;正在引导行业进入新的竞争区间。 在之前的中国电动汽车百人会论坛(2024) 上&#xff0c;比亚迪董事长兼总裁王传福认为&#xff0c;新能源汽车渗透率在未来3个月将超过50%。自动驾驶公司元戎启行CEO周光指出&#xff0c;在上半场的…

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

跟着Carl大佬学leetcode之27 移除元素

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…

数组与伪数组的区别

大家都知道&#xff0c;在js中使用 document.querySelectorAll(选择器&#xff09;获取到的为该选择器能选择到的所有元素组成的伪数组&#xff0c;所谓伪数组&#xff0c;就是外表和数组一样&#xff0c;能够使用索引遍历&#xff0c;但本质是对象。 数组与伪数组之间的区别&…

C语言面试题之合法二叉搜索树

合法二叉搜索树 实例要求 实现一个函数&#xff0c;检查一棵二叉树是否为二叉搜索树&#xff1b; 示例 1: 输入:2/ \1 3 输出: true 示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 &#xff0c;但是其右子节点值为 4 …

测试开发是“懂测试的开发”还是“懂开发的测试”?

这是个很有意思的话题&#xff0c;我一开始画了这么一张图&#xff1a; 就我自身的工作而言&#xff0c;用着开发的技术&#xff0c;做着开发差不多的工作。归为开发一类并无不妥&#xff01; 后来&#xff0c;我细细琢磨了一下&#xff0c;改为了下图。 其实答案也非常明显&a…

动态调整学习率方法(仅供自己学习)

目录 一、StepLR 二、MultiStepLR 三、ExponentialLR 四、CosineAnnealingLR 五、ReduceLRonPlateau 六、LambdaLR 小结&#xff1a;学习率调整​​​​​​​ 一、StepLR optimizer torch.optim.SGD(model.parameters(), lrlearn_rate) scheduler torch.optim.lr_sch…

Linux目录结构知识

一、认识Linux目录 1) Linux目录结构知识 1&#xff09; win: 目录顶点是盘符 C/D/E 。所有的目录结构都在不同的盘符下面&#xff0c;不同的盘之间不能沟通的。 2&#xff09; Linux: 目录顶点是 / &#xff0c;称为根。所有的目录结构都在根下面&#xff0c;他的目录之间都…

Day37:LeedCode 738.单调递增的数字 968.监控二叉树 蓝桥杯 翻转

738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 思路: 假设这个数是98,…