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

目录

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.mzph.cn/bicheng/76203.shtml

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

相关文章

Redisson 实现分布式锁

在平常的开发工作中&#xff0c;我们经常会用到锁&#xff0c;那么锁有什么用呢&#xff1f;锁主要是控制对共享资源的访问顺序&#xff0c;防止多个线程并发操作导致数据不一致的问题。经常可能会听到乐观锁、悲观锁、分布式锁、行锁、表锁等等&#xff0c;那么我们今天总结下…

环境—Ubuntu24(py3.12)安装streamlit(虚拟环境py3.9)

请尽可能不用Ubuntu24请直接跳7.查看解决方案 Action Log 在Ubuntu 24.04中更换为清华源的步骤【Bug】Python 3.12 on Ubuntu 24.04 is Externally Managed - PIP is broken 相关解决方案 从 Ubuntu 24.04 开始&#xff0c;有两个选项&#xff1a; 1. install python pacakg…

【C++进阶】关联容器:set类型

目录 一、set 基本概念 1.1 定义与特点 1.2 头文件与声明 1.3 核心特性解析 二、set 底层实现 2.1 红黑树简介 2.2 红黑树在 set 中的应用 三、set 常用操作 3.1 插入元素 3.2 删除元素 3.3 查找元素 3.4 遍历元素 3.5 性能特征 四、set 高级应用 4.1 自定义比较…

[漏洞篇]SSRF漏洞详解

[漏洞篇]SSRF漏洞详解 免责声明&#xff1a; 本文主要讲解漏洞原理&#xff0c;以及防御手段&#xff0c;旨在帮助大家更好的了解漏洞危害&#xff0c;以及开发中所需要的点&#xff0c;切勿拿来做违法事情&#xff0c;否则后果自负。 一、介绍 概念 SSRF&#xff1a;服务端请…

nuscenes数据集分析

nuscenes数据集分析 标注与总体介绍 nuscenes包含有相机、激光雷达、毫米波雷达、IMU与GPS等设备提供的数据。它的数据采集了1000个场景&#xff0c;每个场景大约有20s&#xff0c;针对目标检测任务&#xff0c;对23类物体进行标注&#xff0c;且以2Hz的频率提供精确的三维目标…

JavaScript学习教程,从入门到精通,JavaScript 运算符及语法知识点详解(8)

JavaScript 运算符及语法知识点详解 一、JavaScript 运算符 1. 算术运算符 用于执行数学运算&#xff1a; 加法- 减法* 乘法/ 除法% 取模&#xff08;余数&#xff09; 递增-- 递减** 幂运算&#xff08;ES6&#xff09; let a 10, b 3; console.log(a b); // 13 conso…

Shell脚本的学习

编写脚本文件 定义以开头&#xff1a;#!/bin/bash #!用来声明脚本由什么shell解释&#xff0c;否则使用默认shel 第一步&#xff1a;编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步&#xff1a;加上执行权限&#xff1a;chmod x 脚本文件名.sh 第三步&…

在线PDF文件拆分工具,小白工具功能实用操作简单,无需安装的文档处理工具

小白工具中的在线 PDF 文件拆分工具是一款功能实用、操作便捷的文档处理工具&#xff0c;以下是其具体介绍&#xff1a; 操作流程 上传 PDF 文档&#xff1a;打开小白工具在线PDF文件拆分工具 - 快速、免费拆分PDF文档 - 小白工具的在线 PDF 文件拆分页面&#xff0c;通过点击 …

数字的乘阶运算

求数字的乘阶&#xff1a; 例如&#xff1a;6的乘阶运算&#xff1a;6*5*4*3*2*1 例如&#xff1a;3的乘阶运算&#xff1a;3*2*1 class Program{static void Main(string[] args){Console.WriteLine("请输入数字&#xff1a;");int num_01 Convert.ToInt32 (Con…

tcp/ip攻击及防范

作为高防工程师&#xff0c;我每天拦截数以万计的恶意流量&#xff0c;其中TCP/IP协议层攻击是最隐蔽、最具破坏性的威胁之一。常见的攻击手法包括&#xff1a; 1. SYN Flood攻击&#xff1a;攻击者发送大量伪造的SYN包&#xff0c;耗尽服务器连接资源&#xff0c;导致正常用…

C++类成员内存分布详解

本文将探讨C类中成员变量的内存分布情况&#xff0c;包括普通成员、静态成员、虚函数等不同情况下的内存布局。 一、基本成员内存布局 1. 普通成员变量 普通成员变量按照声明顺序在内存中连续排列&#xff08;受访问修饰符和内存对齐影响&#xff09;&#xff1a; class Nor…

计算机视觉——为什么 mAP 是目标检测的黄金标准

概述 在目标检测领域&#xff0c;有一个指标被广泛认为是衡量模型性能的“黄金标准”&#xff0c;它就是 mAP&#xff08;Mean Average Precision&#xff0c;平均精确率均值&#xff09;。如果你曾经接触过目标检测模型&#xff08;如 YOLO、Faster R-CNN 或 SSD&#xff09;…

C语言单链表的增删改补

目录 &#xff08;一&#xff09;单链表的结构定义及初始化 (二)单链表的尾插&#xff0c;头插 (三)单链表的尾删&#xff0c;头删 (四)单链表的查找&#xff0c;删除&#xff0c;销毁 单链表是数据结构课程里的第二个数据结构。单链表在逻辑结构是连续的&#xff0c;在物理…

Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…

杀戮尖塔(Slay The Spire) 的全新角色模组 - 女巫

女巫&#xff08;The Witch&#xff09; 杀戮尖塔&#xff08;Slay The Spire&#xff09; 的全新角色模组 女巫模组为游戏增添了超过 75 张新卡牌和 4 个全新遗物&#xff0c;围绕 诅咒&#xff08;Curses&#xff09; 展开独特的玩法体验。她的起始遗物 黑猫&#xff08;Bl…

AI开发学习路线(闯关升级版)

以下是一份轻松版AI开发学习路线&#xff0c;用「闯关升级」的方式帮你从零开始变身AI开发者&#xff0c;每个阶段都配有有趣的任务和实用资源&#xff0c;保证不枯燥、可落地&#xff01;&#x1f447; 目录 &#x1f530; 新手村&#xff1a;打基础&#xff08;1-2个月&…

迭代器模式深度解析与实战案例

一、模式定义 迭代器模式&#xff08;Iterator Pattern&#xff09; 是一种行为设计模式&#xff0c;提供一种方法顺序访问聚合对象的元素&#xff0c;无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离&#xff0c;实现 遍历与存储的解耦。 二、核心组件 组件作用…

SSH远程工具

一、常见SSH远程工具 工具开源跨平台多标签文件传输高级功能价格Xshell❌Win✔️✔️脚本、会话管理免费/商业版Tabby✔️全平台✔️✔️插件扩展免费MobaXterm❌Win✔️✔️集成工具集免费/付费SecureCRT❌Win/macOS/Linux✔️✔️企业级加密$129+PuTTY✔️全平台❌❌基础连接…

VUE中的路由处理

1.引入,预处理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由规…

编程助手fitten code使用说明(超详细)(vscode)

这两年 AI 发展迅猛&#xff0c;作为开发人员&#xff0c;我们总是追求更快、更高效的工作方式&#xff0c;AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手&#xff0c;给我们提供了实时的建议和解决方&#xff0c;无论是快速修复错误、提升代…