C++初阶-C++的讲解1

news2025/4/17 20:43:40

目录

1.缺省(sheng)参数

2.函数重载

3.引用

3.1引用的概念和定义

3.2引用的特性

3.3引用的使用

3.4const引用

3.5.指针和引用的关系

4.nullptr

5.总结


1.缺省(sheng)参数

(1)缺省参数是声明或定义是为函数的参数指定一个缺省值。在调用该函数是,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。

如:

#include<iostream>
using namespace std;
void Func(int n)
{
	cout << n << endl;
}
void Func1(double n = 4.1)
{
	cout << n << endl;
}
int main()
{
	Func(2);
	Func();
	Func1(2);
	Func1();
	return 0;
}

我们在C语言中如果在有参数的时候不传参就会报错,而在C++中如果我们不在声明或定义中设置缺省值都会导致运行出错,但是如果我们在定义时加个缺省值也不会使Func()报错,如:

#include<iostream>
void Func(int n = 4);
using namespace std;
void Func(int n)
{
	cout << n << endl;
}
void Func1(double n = 4.1)
{
	cout << n << endl;
}
int main()
{
	Func(2);
	Func();
	Func1(2);
	Func1();
	return 0;
}

这样就不会有问题,但是最终结果为什么呢?

我们发现我们不传参也会让函数执行该语句,如果我们在定义时设置缺省值而在声明中不设置缺省值结果会怎么样呢?

但是如果我们把声明和定义放在不同文件中呢?

最终都还是能正常打印结果的,所以我们设置缺省值的时候放在哪里都可以。

(2)全缺省:全部参数都给缺省值,半缺省:部分形参给缺省值。

(3)带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << a << ' ' << b << ' ' << c << endl;
}
int main()
{
	Func(1, 2, 3);
	Func(1, 2);
	Func(1);
	Func();
	Func(, 2, 3);
	Func(, , 3);
	return 0;
}

我们发现如果顺序给实参就不会报错,不给实参也不会报错,但是跳跃给实参就会报错,这是规定的,我们不能改变,所以以后使用时要注意了哦!

(4)缺省参数在函数声明和定义中同时出现,规定必须在函数声明给缺省值。

void Func(int n = 0 );
void Func(int n = 1)
{
	cout << n << endl;
}
int main()
{
	Func();
	return 0;
}

运行结果为:

我们如果在给声明和定义的缺省值不同的时候就会报错,这个时候我们要及时调整定义的缺省值了,可以不给,但是必须要在声明中给,因为我们之后要改的时候就好改一些,只是现在我们的代码量不多,之后代码量多了就会知道为啥了,我们都把声明放在头文件中,之后修改直接在里面修改就可以了!(4)中的知识我们可以不遵循,但是建议要遵循!

2.函数重载

C++支持在同一个作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是形参类型不同,也可以是形参个数不同,如:

void Func(int a, int b ,int c)
{
	cout << a << ' ' << b << c << endl;
}
void Func(double a, int b)
{
	cout << a << ' ' << b << endl;
}
void Func()
{
	cout  << endl;
}
void Func(int a, int b)
{
	cout << a << ' ' << b << endl;
}
int main()
{
	Func(1, 2, 3);
	Func(1.1, 2);
	Func();
	Func(1, 2);
	return 0;
}

由于我们没有给' '所以第一行结果我们就没有出现1 2 3

但是如果我们给缺省值呢?

我们的Func()不知道到底是调用哪一个函数,所以会造成报错的问题,所以我们的重名函数建议不要给缺省值,否则很容易造成报错的!至于给缺省值的好处,之后就会知道,现在我们是先简单了解一下。

3.引用

3.1引用的概念和定义

引用是给一个变量取别名,而不是新定义一个变量,也不需要新开辟一块空间,引用的变量和被引用的变量共用同一块空间,如:林冲的别名是豹子头,我们可以叫林冲为豹子头,也可以叫他林冲。引用的写法:int a=0;int& b=a;这个b就是a的别名。其中b的类型还是为int相当于&的前面的变量类型就是引用变量的类型。

3.2引用的特性

(1)引用在定义时必须初始化。我们不能直接int& b;

(2)一个变量可以有多个引用。如:int a=0;int& b=a;int& c=a;

(3)引用一旦引用一个实体就再不能引用其他实体,也就是说引用只能引用一次,比如:

int x=10;int y=0;int& d=y;d=x;

d=x的意思到底是把x的值赋值给d(y)还是给x取别名为d呢?

3.3引用的使用

(1)引用在实践中主要是引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同事改变被引用对象

这句话很难理解,我一句一句来讲,比如我们常用的交换函数就可以来用引用:

void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

这样我们就不需要进行指针的调用了,因为都是一个地址的数据改变。为什么会有“和”后面的内容呢?因为我们的意思就是如果传的参数分别为x,y那么如果a,b改变,那么x,y的值也改变。而这样也不用进行值的拷贝,相对于之前的指针简单多了!

此外,引用也可以给指针变量取别名,可以给结构体取别名,相当于typedef a b;但是我们的a,b只能为变量类型而不能为变量!

如果我们换一个思路来思考:如果我们要增加或减少栈顶所存的数据,那么我们该如何做?

按照之前的思路,我们先取栈顶元素,比如我们要加10,那么我们就让这个栈顶元素加等10,然后把出栈,然后再把结果入栈。但是这样非常麻烦!我们可以直接STTop(s)+=10;在之前看来是不行的,但是这是C++啊,C++规定:返回值具有常性,就相当于被const修饰了。而返回值是临时对象(之后再讲),就相当于临时对象具有常性。所以我们不能通过返回值来修改,而且我们仅仅是改变的只是返回值的结果却不能真正改变栈顶数据,所以我们需要用引用来了。我们之前在定义这个函数时是用的指针吧,现在我们把这个*改为&不也是一样吗,我们这样改了就可以STTop+=10了,因为就是相当于地址所存储的值发生改变了!

需要注意我们不能在函数除了形参外取别名的,因为这样后面空间回收了,而这个地址已经不存储任何数据了就没有任何作用了,所以我们不能进行取别名的操作。

(2)使用引用代替指针传参可以简化程序,避免复杂的指针,其中,结点的结构只能用指针来写,因为需要指针来进行指针指向的改变,而引用却不能改变!

3.4const引用

(1)可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问的权限在引用过程中可以缩小,但是不能放大。

第一句话我们需要用第二句话来理解,我们知道const意味着不可修改,如果我们取了一个别名就变成可修改了,这样是很危险的!因为二者都是一个东西,权限不能扩大。所谓权限就是说变量能修改就是权限大了,不能修改就是权限小了。所以引出第一句话。

const引用也可以引用普通对象,比如:我今天本来准备吃饭,但是人太多了或者有意外的情况下我不准备吃了。这意味着我今天不吃饭,但是后面还是要吃饭的,这是权限缩小,比如:int a=10; const int& c=a;这样的形式是可以的。但是如果const int a=10; int& b=a;这就涉及到权限扩大,是不可以的。

(2)如果我们传参是用另外一个变量类型来传参或者用表达式来传参的情况下,这会生成一个临时对象,这个临时对象具有常性,不可修改。

所以我们可以:const int& b=a*3;但是不可以int& b=a*3因为这个a*3转化为b会涉及到产生临时对象,而这个临时对象在生成的过程中会产生一个别名来存储这个值,而这个别名也是不可修改的,所以我们在进行运算赋值给一个普通引用时就不可以,要用const引用(常引用)。还有一种情况:double d=10.1;int& b=d;会报错,不是d转化为b报错,是因为类型转换时会产生一个临时对象来存储d的小数点前面部分,而这个值也不可修改,所以我们需要const int& b=d

为什么要进行这样?

void func(int& a)
{
	cout << a << endl;
}
int main()
{
	int a = 10;
	func(a);
	func(10);
	func(3.14);
	func(a * 3);
	return 0;
}

我们不能传参以除变量的任何形式,至于原因之前都解释了,但是如果我们加const引用就可以了:

void func(const int& a)
{
	cout << a << endl;
}
int main()
{
	int a = 10;
	func(a);
	func(10);
	func(3.14);
	func(a * 3);
	return 0;
}

这样会使传参的时候类型更丰富。

3.5.指针和引用的关系

二者都有各自的特点,互相不可替代,功能有重叠性。

(1)语法上引用为一个变量取别名,不开辟新空间,指针是存储一个变量地址,要开辟新空间;

(2)引用在定义时,必须初始化,指针建议初始化,但是语法上不是必须的;

(3)引用在初始化引用一个对象后,就不能再引用其他对象,而指针可以不断地改变指向对象;

(4)引用可以直接访问指向对象,而指针需要结引用才能访问指向对象;

(5)sizeof两个东西的含义不同,引用结果为引用类型大学,但指针始终是地址空间锁占字节数;

(6)指针很容易出现空指针和野指针的问题,引用很少出现问题,引用使用起来相对更安全一些(除非引用对象被销毁)。

建议使用引用,指针也可以用,看情况。

4.nullptr

NULL实际是一个宏,在传统C中包含于stddef.h中,在C++中我们如果用NULL,则会打印出0,因为在C++会转换为0,所以相当于直接打印0了,而在C语言中NULL定义为((void*)0),如果打印的话就会报错,因为无法识别。所以我们用nullptr来代替NULL,以防这两个问题。所以我们之后在使用NULL时把NULL改为nullptr即可。

5.总结

这章内容有点上难度了,但是总体来说理解不是很难,主要掌握引用的用法就可以了,其他的不是太大的问题。喜欢的可以一键三连哦,下次再见!

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

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

相关文章

STM32_USB

概述 本文是使用HAL库的USB驱动 因为官方cubeMX生成的hal库做组合设备时过于繁琐 所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备 有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存 插件安装 下载地址 https://github.com/alambe94/I-CUBE-USBD-Com…

STM32 的编程方式总结

&#x1f9f1; 按照“是否可独立工作”来分&#xff1a; 库/方式是否可独立使用是否依赖其他库说明寄存器裸写✅ 是❌ 无完全自主控制&#xff0c;无库依赖标准库&#xff08;StdPeriph&#xff09;✅ 是❌ 只依赖 CMSIS自成体系&#xff08;F1专属&#xff09;&#xff0c;只…

MFC工具栏CToolBar从专家到小白

CToolBar m_wndTool; //创建控件 m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC); //加载工具栏资源 m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定义&#xff1a;IDR_TOOL_LOAD BITMAP …

大厂机考——各算法与数据结构详解

目录及其索引 哈希双指针滑动窗口子串普通数组矩阵链表二叉树图论回溯二分查找栈堆贪心算法动态规划多维动态规划学科领域与联系总结​​ 哈希 ​​学科领域​​&#xff1a;计算机科学、密码学、数据结构 ​​定义​​&#xff1a;通过哈希函数将任意长度的输入映射为固定长度…

10:00开始面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

基于ueditor编辑器的功能开发之给编辑器图片增加水印功能

用户需求&#xff0c;双击编辑器中的图片的时候&#xff0c;出现弹框&#xff0c;用户可以选择水印缩放倍数、距离以及水印所放置的方位&#xff08;当然有很多水印插件&#xff0c;位置大小透明度用户都能够自定义&#xff0c;但是用户需求如此&#xff0c;就自己写了&#xf…

【CSS基础】- 02(emmet语法、复合选择器、显示模式、背景标签)

css第二天 一、emmet语法 1、简介 ​ Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法。 ​ 快速生成HTML结构语法 ​ 快速生成CSS样式语法 2、快速生成HTML结构语法 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab…

【码农日常】vscode编码clang-format格式化简易教程

文章目录 0 前言1 工具准备1.1 插件准备1.2 添加.clang-format1.3 添加配置 2 快速上手 0 前言 各路大神都说clangd好&#xff0c;我也来试试。这篇主要讲格式化部分。 1 工具准备 1.1 插件准备 照图安装。 1.2 添加.clang-format 右键添加文件&#xff0c;跟添加个.h或者.c…

金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类

一、网络数据采集 证券宝是一个免费、开源的证券数据平台&#xff08;无需注册&#xff09;&#xff0c;提供大盘准确、完整的证券历史行情数据、上市公司财务数据等&#xff0c;通过python API获取证券数据信息。 1. 安装并导入第三方依赖库 baostock 在命令提示符中运行&…

死锁 手撕死锁检测工具

目录 引言 一.理论联立 1.死锁的概念和原因 2.死锁检测的基本思路 3.有向图在死锁检测中的应用 二.代码实现案例&#xff08;我们会介绍部分重要接口解释&#xff09; 1.我们定义一个线性表来存线程ID和锁ID 2.表中数据的查询接口 3.表中数据的删除接口 4.表中数据的添…

软考高级-系统架构设计师 案例题-软件架构设计

文章目录 软件架构设计质量属性效用树&#xff0c;质量属性判断必背概念架构风格对比MVC架构J2EE四层结构面向服务架构SOA企业服务总线ESB历年真题【问题1】 &#xff08;12分)【问题2】&#xff08;13分&#xff09; 参考答案历年真题【问题1】&#xff08;12分&#xff09;【…

vue+d3js+fastapi实现天气柱状图折线图饼图

说明&#xff1a; vued3jsfastapi实现天气柱状图折线图饼图 效果图&#xff1a; step0:postman 1. 生成天气数据&#xff08;POST请求&#xff09;&#xff1a;URL: http://localhost:8000/generate-data/?year2024&month3&seed42 方法: POST Headers:Content-Type:…

vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf

一、本文目标 <iframe> 方法预览 pdf 、word vue-pdf 预览pdf 二、<iframe> 方法 2.1、iframe 方法预览需要 浏览器 设置为&#xff1a; chrome&#xff1a;设置-隐私设置和安全性-网站设置-更多内容设置-PDF文档 浏览器访问&#xff1a; chrome://settings/co…

【NLP 56、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence()&#xff1a; ② decode()&#xff1a; 代码运行流程 ③ padding()&#xff1a; 代码…

【力扣hot100题】(076)买卖股票的最佳时机

终于来到了最考验智商的贪心算法。 之前做过&#xff0c;但花了不少时间思考&#xff0c;所以这次做的很快。 思路就是记录最小价格&#xff0c;然后一路遍历边调整新的最小价格边比较目前价格和最小价格差价。 class Solution { public:int maxProfit(vector<int>&am…

c#的form实现叠叠乐游戏

说明&#xff1a; 我希望用c#的form实现叠叠乐的游戏&#xff0c;玩家需要堆叠方块来建造高塔。 效果图&#xff1a; step1:游戏规则 游戏实现步骤&#xff1a; a. 处理事件&#xff0c;玩家可以释放摆动的方块&#xff0c;方块会下落。 b. 更新摆动方块的位移&#xff0c;根…

Qt中的元对象系统

Qt的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。 元对象系统基于以下三个方面&#xff1a; (1).QObject类&#xff1a;为可以利用元对象系统的对象提供了基类。 (2).Q_OBJECT宏&#xff1a;用于启用元对象功能&#xff0c;…

qt之opengl使用

使用qt中的openglWidget绘制一个三角形。自定义的类继承关系sunOpengl : public QOpenGLWidget,QOpenGLFunctions_3_3_Core 代码如下 /*----MainWindow.cpp----------------------------------------------*/ #include "mainwindow.h" #include "./ui_mainwin…

晋城市电子健康证上传照片尺寸要求及手机拍照制作方法

晋城市餐饮从业人员健康证电子照片上传有着明确的技术规范。根据"晋城市从业人员电子健康证明服务平台"要求&#xff0c;照片尺寸应为358像素&#xff08;宽&#xff09;441像素&#xff08;高&#xff09;&#xff0c;这一比例符合标准证件照的规格。照片底色可选择…

js实现跨域下载,展示下载进度以及自定义下载名称功能

一、 下载进度 loading弹窗结构 // loading状态DOM function setLoading() {let content document.querySelector(.loading)content.innerHTML content.innerHTML <div class"loading_content"><div class"contentBox"><div class&quo…