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://xiahunao.cn/news/3223723.html

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

相关文章

怎么转播别人的直播

转播别人的直播&#xff0c;特别是实现无缝的实时转播&#xff0c;可以通过一些平台的功能来实现&#xff0c;比如快手和抖音。下面是一个基本的步骤说明&#xff0c;但请注意&#xff0c;具体操作可能会因平台更新或政策变化而有所不同&#xff1a; 找到想要转播的直播间&…

新品茶叶如何一炮而红?营销高手的实战指南!

茶叶&#xff0c;作为中国传统的饮品&#xff0c;已经深入到了我们的日常生活。 随着生活水平的提升&#xff0c;人们对茶叶的需求也在水涨船高。 面对市场上琳琅满目的新品茶叶&#xff0c;如何让自家品牌脱颖而出&#xff0c;确实是现在头疼的问题。下面给大家分享一些目前…

PLC通信网关有什么功能特点?PLC通信网关工作原理-天拓四方

在工业自动化日益发展的今天&#xff0c;PLC已成为工业控制领域的核心设备。工业自动化与信息化深度融合&#xff0c;PLC的应用日益广泛。PLC通信网关&#xff0c;作为工业物联网的重要组成部分&#xff0c;扮演着连接PLC与云平台的桥梁角色&#xff0c;实现设备间的数据交换与…

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

第二章节:JavaScript 基础

参考:https://blog.csdn.net/2303_78006750/article/details/138022514 **说明:**本章节所介绍的 JavaScript 并不深入,因为在 Web 安全领域不需要对 JavaScript 掌握非常深入,我们只需要能够利用本章节提及到的一些语句对网站进行测试就足够了。 1)JavaScript 简介 01-J…

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重复第二步&…

MySQL GROUP_CONCAT 函数详解与实战应用

提示&#xff1a;在需要将多个值组合成一个列表时&#xff0c;GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示&#xff1a;这里可以添加本文要记录的大概内容…

Jmeter在信息头中设置Bearer与 token 的拼接值

思路&#xff1a;先获取token&#xff0c;将token设置成全局变量&#xff0c;再与Bearer拼接。 第一步&#xff1a;使用提取器将token值提取出来&#xff0c;使用setProperty函数将提取的token值设置成全局变量&#xff0c;在登录请求后面添加BeanShell取样器 或者 BeanShell后…

【work】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结&#xff1a; 小菜鸡写一写基础深度学习的问题&#xff08;复制大佬的&#xff0c;自己复习用&#xff09; - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

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

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

Linux|背景 环境搭建

目录 一、简述Linux发展史 1.1计算机的诞生 1.2操作系统的诞生 1.3Linux操作系统开源 1.4Linux发行版本 二、搭建Linux环境 三、使用shell远程登入到Linux 一、简述Linux发展史 可能大家未听说过Linux&#xff0c;或者只知道它是一个搭配在计算机上的操作系统&#xff0…

【刷题汇总 -- 求最小公倍数、数组中的最长连续子序列、字母收集】

C日常刷题积累 今日刷题汇总 - day0081、求最小公倍数1.1、题目1.2、思路1.3、程序实现 -- 穷举法1.2、程序实现 -- 辗转相除法 2、数组中的最长连续子序列2.1、题目2.2、思路2.3、程序实现 3、字母收集3.1、题目3.2、思路3.3、程序实现 4、题目链接 今日刷题汇总 - day008 1、…

02day-C++学习(const 指针与引用的关系 inline nullptr)

02day-C学习 1. 使用const注意事项 注意事项 • 可以引⽤⼀个const对象&#xff0c;但是必须⽤const引⽤。const引⽤也可以引⽤普通对象&#xff0c;因为对象的访 问权限在引⽤过程中可以缩⼩&#xff0c;但是不能放⼤。 • 不需要注意的是类似 int& rb a3; double d 1…

Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

总结/朱季谦 某天同事突然问我&#xff0c;你知道Mybatis Plus的insert方法&#xff0c;插入数据后自增id是如何自增的吗&#xff1f; 我愣了一下&#xff0c;脑海里只想到&#xff0c;当在POJO类的id设置一个自增策略后&#xff0c;例如TableId(value "id",type …

单对以太网连接器多场景应用

单对以太网连接器应用场景概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;作为一种新兴的以太网技术&#xff0c;以其独特的优势在多个领域得到了广泛的应用。SPE通过单对电缆进行数据传输&#xff0c;支持高速数据传输&#xff0c;同时还能…

【python基础】—入门函数print()的参数解析及使用场景

文章目录 一、print()函数二、区隔符—sep三、结束符号—end四、内容写入文件—file五、缓冲输出设置—flush 一、print()函数 功能 print()函数就是把一个或多个对象转换为其文本表达式形式&#xff0c;然后发送给标准输出流或者类似的文件流。 语法 print(value, …, sep’ …

一行代码,开发项目使用阿里巴巴图标-暂存库

减少项目内存&#xff0c;适用于一切项目。防止你使用线上官网的图标&#xff0c;官网更新后&#xff0c;你项目中的图标也消失不能用。此外微信小程序代码上线2M&#xff0c;很实用。 把图标存在阿里巴巴图标库 如下图&#xff1a; 可以在这新建项目并上传项目需要的图标 …

移动公厕有无人显示屏为何多采用RS485、IO信号通讯方式

在户外活动、临时集会或是应急情况下&#xff0c;移动公厕作为解决人们生理需求的重要设施&#xff0c;发挥着不可替代的作用。然而&#xff0c;随着人口密度的增加和对公共卫生要求的提高&#xff0c;如何确保移动公厕的高效利用和良好维护&#xff0c;成为了组织者和管理者面…

《大语言模型的临床和外科应用:系统综述》

这篇题为《大语言模型的临床和外科应用&#xff1a;系统综述》的文章对大语言模型&#xff08;LLM&#xff09;目前在临床和外科环境中的应用情况进行了全面评估。 大语言模型&#xff08;LLM&#xff09;是一种先进的人工智能系统&#xff0c;可以理解和生成类似人类的文本。…

突破传统,实时语音技术的革命。Livekit 开源代理框架来袭

🚀 突破传统,实时语音技术的革命!Livekit 开源代理框架来袭! 在数字化时代,实时通信已成为我们日常生活的一部分。但你是否曾想象过,一个能够轻松处理音视频流的代理框架,会如何改变我们的沟通方式?今天,我们就来一探究竟! 🌟 什么是 Livekit 代理框架? Live…