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

news2025/3/12 19:07:11

初始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. 引用指针用起来相对安全

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度Create AI开发者大会剧透丨用好三大AI神器 ,人人都是开发者

程序员会消失&#xff0c;真的吗&#xff1f;大模型的下一站是什么&#xff1f;开发者的机会在哪里&#xff1f;什么才是最好用的AI应用开发工具&#xff1f;在4月16日举办的2024百度Create AI开发者大会上&#xff0c;百度创始人、董事长兼首席执行官李彦宏将就这些备受瞩目的…

蓝桥杯第十三届电子类单片机组决赛程序设计

前言 一、决赛题目 1.比赛题目 2.题目解读 二、功能实现 1.关于定时器资源 1&#xff09;超声波和NE555需要的定时器资源 2&#xff09;定时器2 2.单位切换 3.数据长度不足时&#xff0c;高位熄灭 4.AD/DA多通道的处理 5.PWM输出 6.长按功能的实现 三、完整代码演…

心法利器[112] | 考古RAG-20年RAG概念提出的论文

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2023年文章合集来袭&#xff0c;更…

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式&#xff08;Visitor Pattern&#xff09;1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派&#xff08;多态&am…

ubuntu 20.04 更新显卡驱动

1. 问题描述 $ watch -n 1 nvidia-smi画面不动 而且运行 pytorch 代码时出现问题&#xff1a; UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11070). Please update your GPU driver by downloading and installing a new…

libVLC 视频窗口上叠加透明窗口

很多时候&#xff0c;我们需要在界面上画一些三角形、文字等之类的东西&#xff0c;我们之需要重写paintEvent方法&#xff0c;比如像这样 void Widget::paintEvent(QPaintEvent *event) 以下就是重写的代码。 void Widget::paintEvent(QPaintEvent *event) {//创建QPainte…

家居网购项目(一)

文章目录 1.前置知识1.项目开发阶段2.Java经典三层架构3.项目具体分层&#xff08;包方案&#xff09;4.MVC 2.开发环境搭建1.新建普通javaweb项目&#xff0c;导入jar包2.创建项目结构3.搭建前端页面 3.会员注册前端js校验1.需求分析2.代码login.html 3.结果4.调试阶段1.验证信…

算法训练营第24天回溯(组合)

回溯&#xff08;组合&#xff09; 模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&…

6.11物联网RK3399项目开发实录-驱动开发之定时器的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u 定时器使用 前言 RK3399有 12 个 Timers (timer0-timer11)&#xff0c;有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 …

LC 501.二叉搜索树中的众数

501.二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 …

深入浅出 -- 系统架构之在Java体系中的微服务标准组件

前面我们介绍了微服务架构的各个组件以及各组件的职责&#xff0c;在Java领域中&#xff0c;Spring可以说是无人不知无人不晓的&#xff0c;我们现代的企业级应用和互联网应用&#xff0c;很大一部分都是构建在Spring生态体系上的&#xff0c;同样&#xff0c;实现微服务架构的…

MySQL高级详解

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

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

一辆新能源汽车需要多少颗传感器?

随着科技的发展和环保意识的日益提高&#xff0c;新能源汽车&#xff08;包括纯电动汽车、混合动力汽车等&#xff09;在全球范围内越来越受到欢迎。这些汽车不仅减少了碳排放&#xff0c;还推动了汽车产业的创新。然而&#xff0c;这些高科技汽车的背后&#xff0c;隐藏着许多…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)

文章目录 前言&#xff1a;一、下载(一).链接&#xff08;直达JDK21&#xff09;(二).官网搜索&#xff08;可选其他版本&#xff09; 二、安装三、环境变量配置四、验证安装和配置五、常见问题解答 前言&#xff1a; 本文将为您提供关于Java官网下载JDK21版本的详细教程。作为…

springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案

不多说 直接上代码 第一步 package com.xxx.init.webFilter;import com.alibaba.fastjson.JSONObject; import com.xxx.api.constant.CommonConstant; import com.xxx.api.entities.log.OperationLog; import com.xxx.init.utils.JwtHelper; import com.xxx.init.utils.Reques…

King‘s AUTO的QI妙能力|实验室“总导演”

在2023年夏天&#xff0c;两场国际赛事分别在成都、杭州盛大举办——第31届世界大学生夏季运动会&#xff08;大运会&#xff09;以及第19届亚洲运动会&#xff08;亚运会&#xff09;。为确保开幕式的顺利进行&#xff0c;大运会共进行了三次全要素彩排&#xff0c;而亚运会则…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

【MATLAB源码-第185期】基于matlab的16QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…