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);//相当于传一个常数0
	f1((int*)NULL);// f1((void*)NULL);将NULL强转为指针类型
	f1(nullptr);//空指针
	return 0;
}

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

四、总结:

 继续努力!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode--层数最深叶子节点的和

leetcode地址&#xff1a;层数最深叶子节点的和 给你一棵二叉树的根节点 root &#xff0c;请你返回 层数最深的叶子节点的和 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出&#xff1a;15 示例 2&#xff1a; 输入&#xff…

SpringSecurity中文文档(Servlet Method Security)

Method Security 除了在请求级别进行建模授权之外&#xff0c;Spring Security 还支持在方法级别进行建模。 您可以在应用程序中激活它&#xff0c;方法是使用EnableMethodSecurity 注释任何Configuration 类&#xff0c;或者将 < method-security > 添加到任何 XML 配…

c++ learn third day

1.津津的储蓄计划 参考&#xff1a;http://t.csdnimg.cn/XI1HV 记得最后加上num&#xff01;&#xff01;&#xff01; #include<stdio.h> int main() {int arr[13]{0};int num0,i0,j;double sum0;for(j1;j<12;j){scanf("%d",&arr[j]);}for(i1;i<…

【UML用户指南】-32-对体系结构建模-部署图

目录 1、对嵌入式系统建模 2、对客户/服务器系统建模 3、对全分布式系统建模 部署图展示运行时进行处理的结点和在结点上生存的制品的配置。 部署图用来对系统的静态部署视图建模。 在UML中&#xff0c;可以 1&#xff09;利用类图和制品图来思考软件的结构&#xff0c; …

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心&#xff0c;亚信安全新一代终端安全TrustOne自2023年发布以来&#xff0c;带动了数字化终端安全的革新。60%&#xff0c;安装部署及管理效率的提升&#xff1b;50%&#xff0c;安全管理资源的节省&#xff1b;100%&#xff0c;信创非信创场景的全覆盖。Trus…

leetcode hot100

哈希 49.字母异位词分组 HashMap的含义比较晕&#xff0c;可以重做 双指针 11.盛最多水的容器 双指针的起始位置和移动条件没转过来&#xff0c;可以重做 15.三数之和 不太熟练&#xff0c;可以再做一遍 42.接雨水 还可以用dp和单调栈做 双指针法&#xff1a; 首先需要注意…

Linux-多线程

线程的概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#xff0c;在CPU眼中…

人话学Python-基础篇-字符串

一&#xff1a;字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二&#xff1a;字符串的访问 如果我们要取出字符串中单独的字符&#xff0c;需要使用方括号来表示取得的位置。如果要取出字符串的子串&…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

救生拉网的使用方法及注意事项_鼎跃安全

水域救援在夏季尤为重要&#xff0c;随着气温的升高&#xff0c;人们更倾向于参与水上活动&#xff0c;如游泳、划船、垂钓等&#xff0c;这些活动虽然带来了乐趣和清凉&#xff0c;但同时也增加了水域安全事故的风险。救生拉网作为水域安全的重要工具之一&#xff0c;其重要性…

ProFuzzBench入门教学——使用(Ubuntu22.04)

ProFuzzBench是网络协议状态模糊测试的基准测试。它包括一套用于流行协议&#xff08;例如 TLS、SSH、SMTP、FTP、SIP&#xff09;的代表性开源网络服务器&#xff0c;以及用于自动执行实验的工具。详细参考&#xff1a;阅读笔记——《ProFuzzBench: A Benchmark for Stateful …

Thinking--在应用中添加动态水印,且不可删除

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 水印是一种用于保护版权和识别内容的技术&#xff0c;通常用于图像、视频或文档中。它可以是文本、图像或两者的组合&#xff0c;通常半透明或以某种方式嵌入到内容中&#xff0c;使其不易被移除或篡改…

非营利组织的数据治理之路

在非营利组织的日常运营中&#xff0c;数据不仅是记录过去活动的工具&#xff0c;更是指导未来决策、衡量项目成效、增强公众信任以及优化资源配置的关键要素。 然而&#xff0c;随着数据量的不断增长和复杂性的提升&#xff0c;非营利组织在享受数据带来的便利的同时&#xf…

文件操作和IO流

前言&#x1f440;~ 上一章我们介绍了多线程进阶的相关内容&#xff0c;今天来介绍使用java代码对文件的一些操作 文件&#xff08;file&#xff09; 文件路径&#xff08;Path&#xff09; 文件类型 文件操作 文件系统操作&#xff08;File类&#xff09; 文件内容的读…

一、openGauss详细安装教程

一、openGauss详细安装教程 一、安装环境二、下载三、安装1.创建omm用户2.授权omm安装目录3.安装4.验证是否安装成功5.配置gc_ctl命令 四、配置远程访问1.配置pg_hba.conf2.配置postgresql.conf3.重启 五、创建用户及数据库 一、安装环境 Centos7.9 x86openGauss 5.0.1 企业版…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…

RedHat Linux8 修改root管理员账户密码命令

RedHat Linux8 修改root管理员账户密码命令&#xff1a; sudo passwd root RedHat重置root管理员密码&#xff1a; 1. 查看Linux系统版本信息 cat /etc/redhat-release2. 重置密码 2.1 进入内核编辑界面 重启Linux系统并出现引导界面&#xff0c;按下键盘上的e键进入内…

数据结构双向循环链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { double_p Hcreate_head(); insert_head(H,10); insert_head(H,20); insert_head(H,30); insert_head(H,40); insert_tail(H,50); show_link(H); del_tail(H); …

阈值分割后配合Connection算子和箭头工具快速知道区域的ID并选择指定区域

代码 dev_close_window () read_image (Image, E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S2/1号机/1.bmp) get_image_size …

【技术选型】MySQL、Oracle、Postgresql如何选择

【技术选型】MySQL、Oracle、Postgresql如何选择 开篇词&#xff1a;干货篇&#xff1a;MySQL&#xff1a;Oracle&#xff1a;PostgreSQL&#xff1a; 总结篇&#xff1a;我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#xff01; 开篇词&#xff1a; 常见几种关…