C++入门基础(2)

目录

一、引用:

1、定义:

 2、特性:

 3、引用的使用:

4、const引用:控制权限

const引用定义:

const引用可以接收3种对象:

1、正常对象:

2、临时对象:

3、const对象:

总结:

5、引用与指针的关系:

二、内联函数:

​编辑 三、nullptr:

四、总结:


一、引用:

1、定义:

       ✨✨引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头✨✨


👉👉 类型& 引⽤别名 =  引⽤对象

 ✨✨引用的出现代替了指针,对引用进行修改,就相当于对本名(引用对象)进行修改

 2、特性:

//在定义时要初始化
//一个变量可以有多个引用
//引用一旦引用一个实体,再不能引用其他实体

初始化,决定了别名,该别名就一直是a的别名



 已经有了实体了,不会引用其他的实体

 

 3、引用的使用:

1. 引⽤在实践中主要是于引⽤传参引⽤做返回值减少拷⻉提⾼效率改变引⽤对象时同时改变被引⽤对象

2.引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。

3. 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点互相不可替代。C++的引⽤跟其语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向。

4.⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针



4、const引用:控制权限

先补充一点说明:✨临时对象

临时对象:编译器需要⼀个空间暂存表达式的求值结果临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象;

✨👉🤔临时对象也就是存放一些结果的变量,使用完后会销毁

 C++规定:临时对象具有常性(只能读,不能改)

//表达式求值
// 1、a+b 表达式运算
// 2、int a = 1; double b = a;a转换成double型(隐式类型的转换)
//3、整形提升
//4、传值调用的返回值
//5、截断
//………………

const引用定义:

        可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩但是不能放⼤!!!!权限小了,也就是不能进行修改了

👉总之:引用可以引用 权限比自己大的,但是不能引用 权限比自己小的,自己的权限必须和引用对象的权限相同,或者比引用对象小!!

const引用可以接收3种对象:

1、正常对象:
int main()
{int a = 10;const int& b = a;//权限缩小return 0;
}

🧑‍🎓🧑‍🎓但是 b不能修改a的值因为此时b的权限缩小了《《只能读,不能修改

👉👉但是a可以进行修改

2、临时对象:
int main()
{double a = 10;const int& b = a;//int& b = a;不可以return 0;
}

🧑‍🎓🧑‍🎓临时对象具有常性,因为要发生隐式转换,对于常性,它的权限是只读不可改,那么我们就要一个只读不可改的引用即const引用


对于常量也可以使用引用,但是根据权限对应,需要使用const引用才行,当然也不能给常量进行修改

int main()
{//int& a = 10;错误的引用,常量的权限是只读不可改const int& a = 10;return 0;
}
3、const对象:
int main()
{const int a = 10;//具有了常属性const int& b = a;return 0;
}

🧑‍🎓🧑‍🎓对于const的对象进行引用时,必须用同等权限的引用,即const引用; 

总结:

const引用就是改变了引用的控制权限权限,其权限满足如下表达式

5、引用与指针的关系:

🧑‍🎓🧑‍🎓 C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥引⽤是弟弟,在实践中他们相辅相成功能有重叠性,但是各有⾃⼰的特点互相不可替代

 //语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。//• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。//• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。//• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。//• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)//• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些

二、内联函数:

关键字inline + 函数声明

🧑‍🎓🧑‍🎓inline修饰函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率

🧑‍🎓🧑‍🎓inline对于编译器⽽⾔只是⼀个建议(我和你说一声,听不听,取决于你的想法,我无法左右你必须听我的),也就是说,你加了inline 编译器可以 选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。✨✨inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略展开太多了,代码量会太大✨✨

 ✨✨C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数

注意:inline不建议声明和定义分离到两个⽂件(分装),分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。


 三、nullptr:

C++中NULL可能被定义为字⾯常量0,或者 C中被定义为⽆类型指针(void*)的常量。🧑‍🎓🧑‍🎓不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦;

🧑‍🎓🧑‍🎓 C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型不能被转换为整数类型


🧑‍🎓🧑‍🎓C++不允许void*类型的数据给其他类型的指针,必须墙砖同类型;

void f1(int x)
{cout << "f(int x)" << endl;
} 
void f1(int* ptr)
{cout << "f(int* ptr)" << endl;
} 
int main()
{f1(0);// f1(NULL);//相当于传一个常数0f1((int*)NULL);// f1((void*)NULL);将NULL强转为指针类型f1(nullptr);//空指针return 0;
}

nullptr相当于c语言中的NULL,但是不能转换成整形

四、总结:

 继续努力!!

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

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

相关文章

C++笔试强训3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 如图所示&#xff0c;如图所示p-3指向的元素是6&#xff0c;printf里面的是%s&#xff0c;从6开…

Java爬虫翻页

编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端&#xff08;如Apache HttpClient或OkHttp&#xff09;来发送请求&#xff0c;解析HTML页面&#xff08;如使用Jsoup库&#xff09;&#xff0c;以及处理分页逻辑&#xff08;如通过URL参数或页面内的链接进行翻页&#xff…

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

C++休眠的方法

Windows的API函数 Sleep(INFINITE); 休眠时间为永久 Linux的API函数sleep 没有直接表示无限时间的参数&#xff0c;根据POSIX标准&#xff0c;sleep() 函数的参数应该是 unsigned int 类型&#xff0c;因此最大可以接受的参数值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集&#xff08;11个2D1个3D&#xff09; 对计算机而言&#xff0c;上述输入、输出维度大小是按次数定义的。 以“Vel&#xff0c;F…

线程池【开发实践】

文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用&#xff08;优点&#xff09;1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略&#xff08;可自定…

appium 实战问题 播放视频时无法定位到元素

背景 在做UI自动化时&#xff0c;有播放详情页的用例&#xff0c;但是发现视频在播放的时候无法定位到元素或者很慢&#xff0c;了解到appium在动态的页面实时获取布局元素导致定位变慢。所以只能将视频暂停在操作元素&#xff0c;点击到暂停按钮又是个问题&#xff0c;通过ad…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

Spring Boot项目中JPA操作视图会改变原表吗?

一直有一种认识就是:使用JPA对视图操作,不会影响到原表。 直观的原因就是视图是一种数据库中的虚拟表,它由一个或多个表中的数据通过SQL查询组成。视图不包含数据本身,而是保存了一条SQL查询,这条查询是用来展示数据的。 但是在实际项目种的一个场景颠覆和纠正了这个认识…

汇川伺服 (4)FFT、机械特性、闭环、惯量、刚性、抑制振动

一、参数解释 二、FFT 三、机械特性分析 四、多级配方与对象字典 对机组网配方 对象字典 五、InoServoShop 主要是用于调试620P620N将压缩报解压后不需要安装就可以直接使用 六、InoDriveWorkShop 主要是调试660 670 810 520 等系列 惯量识别 Etune Stune 惯量比调试 大惯…

Error:sql: expected 1 arguments, got 2

一 背景 在测试一个API接口时&#xff0c;看到日志里面突然抛出一个错误&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;对应的表里面是有相关数据的&#xff0c;sql语句放在mysql里面执行也是没问题&#xff01;那奇了怪了&#xff0c;为啥会产生这样…

git只列出本地分支

git只列出本地分支 git branch --list git强制删除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章浏览阅读648次。git branch -d 可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。git删除远程remote分支…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

【Go语言】Go语言的占位符

Go语言的占位符 Golang 的字符串占位符在 fmt 包的各种打印函数中使用&#xff0c;如 fmt.Printf、fmt.Sprintf。 变量值与类型的打印 %v: 打印变量的值 %v 会根据变量的类型选择合适的格式进行打印。对于结构体&#xff0c;%v 会打印出结构体的字段。对于指针类型&#xf…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程&#xff08;NAPI机制&#xff09; 平台环境简介&#xff1a;宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 &#xff08;ubuntu 虚拟机默认网卡驱动&#xff09;协议&#xff1a;TCP协议&#xff0c;本文分析收包过程 本…

缓存新境界:Eureka中服务的分布式缓存实现策略

缓存新境界&#xff1a;Eureka中服务的分布式缓存实现策略 引言 在微服务架构中&#xff0c;服务间的通信和数据交换频繁&#xff0c;引入分布式缓存可以显著提高系统性能和响应速度。Eureka作为Netflix开源的服务发现框架&#xff0c;虽然本身不提供缓存机制&#xff0c;但可…

【线程状态-2】

1、线程礼让 &#xff08;1&#xff09;礼让线程&#xff0c;让当前正在执行的线程暂停&#xff0c;但不阻塞 &#xff08;2&#xff09;将线程从运行状态转为就绪状态 &#xff08;3&#xff09;让cpu重新调度&#xff0c;礼让不一定成功&#xff01;看cpu心情 package st…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

【AI工具介绍】— webkit简介

目录 一、起源与发展 二、核心组件与功能 三、特性与优势 四、应用与影响 五、结论 一、起源与发展 WebKit起源于苹果公司&#xff0c;最初是为了开发Safari浏览器而创建的。WebKit项目的起源可以追溯到苹果公司在2001年推出基于Unix的操作系统Mac OS X时&#xff0c;对浏…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因&#xff1a;这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量&#xff08;此变量我们看不到&#xff09;&#xff0c;此环境变量优先级较高&#xff0c;导致我们在切换回JDK8后系统会先读取到JDK11生成的…