【C++百宝箱】语法总结:引用 | 内联函数 | auto | 范围for循环

news2024/11/15 22:58:36

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C++入门宝典

🔥本文主要探讨C++的语法,并深入了解C++如何针对C语言中存在的不合理之处进行优化改进。

目录:

  • ⌛️ 引用
    • ✉️ 特性
    • ✉️ 常引用
    • ✉️ 使用场景
    • ✉️ 引用和指针
  • ⌛️ inline内敛函数
  • ⌛️ auto关键字
  • ⌛️ 基于范围的for循环
  • ⌛️ 空指针nullptr
  • ❤️ 结语

⌛️ 引用

 在C++中,引用是C语言的重要扩充。在语法层面上,引用是给已存在的变量取了一个别名,对引用的操作与对原变量的操作是完全相同的。编译器不会为引用变量开辟新的内存空间,而是让它和原变量共用同一块内存空间

 引用被声明为变量的类型,后面跟着一个&符号,表示这是一个引用类型。可以按照type& name = variable的形式来定义一个引用类型。

int main()
{
	int value = 0;
	int& tmp = value; //tmp是value的引用
    
	tmp = 10;//修改tmp的值,value的值也会变为10 

	return 0;
}

注意:引用类型必须和引用实体是同种类型的,否则将会导致编译错误。

✉️ 特性

📙在前文中,我们提到了引用的概念,现在我们将阐述引用的特性。

  • 引用在定义时必须初始化。

 引用需要一个有效的对象,如果不初始化,会在编译时出错。

  • 一旦引用一个实体,就不能引用其他实体。

这个特性是引用与指针的一个主要区别。指针可以在任何时候被重新指向另一个实体,而引用一旦被初始化,就不能改变其引用的实体。

  • 一个变量可以有多个引用。

 可以为一个变量创建多个引用,每个引用都是这个变量的别名,也可以对别名继续取别名。

✉️ 常引用

 常引用是C++中引用的一种特殊形式,它在声明时必须在引用前面加上const关键字。常引用的主要目的是为了防止通过引用来修改所引用的变量。

  • 权限不能放大,可以平移。


  • 权限可以缩小。

 🔭 此外,还需要注意一种情况:类型转换。

    double value = 3.14;
	const int& tmp = value;

📙 value是double类型,如果用int& tmpvalue进行引用,会出现类型转换。实际上,tmp是引用了一个value产生的临时变量,这个临时变量具有常性,所以必须加上const进行修饰,防止权限扩大

✉️ 使用场景

 C++的引用在传参和作返回值上具有重要应用价值。

  • 传参:
//交换两个值
void Swap(int& value, int& num)
{
	int tmp = value;
	value = num;
	num = value;
}

📙引用传参有两个价值:① 由于引用相当于别名,所以在函数中可以对引用实体直接操作。②引用没有分配实际的内存空间,可以节省大量的内存空间,提高效率。

  • 作返回值
#include<iostream>
#include<assert.h>

using namespace std;

int& Fun(int* arr, int pos)//传引用返回
{
	assert(arr);
	return arr[pos];
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	Fun(arr, 3) = 10; // 数组第4个元素被修改为10
	cout << arr[3] << endl;
	return 0;
}

📙引用作返回值除了能提高效率外,最重要的是可以通过引用返回来修改返回对象

注意:
 传引用返回的方式适用于出了函数作用域(栈帧销毁)后,仍然还存在的对象。如果对象一旦出了函数作用域就被销毁,这时候引用返回的对象是未知的,这种情况最好使用传值返回。

✉️ 引用和指针

 从语法角度看,引用自身没有开辟空间,而是与引用对象共用同一块空间。然而,从底层来看,引用的实现需要开辟空间,并且底层是依靠指针实现的。之所以使用方法不同,是因为对引用的封装。

 两者的汇编代码也是非常相似的。

📘 指针和引用的区别:

  • 内存分配:语法层面上,引用本身不分配内存空间,它是对已有变量的别名,与被引用变量共享内存空间。而指针变量需要分配内存空间来存储变量的地址。

  • 初始化:引用在定义时必须被初始化,指针没有要求。

  • 指向:引用一旦初始化后就不能再被改变。而指针可以在任何时候被重新指向一个不同的变量。

  • 自增(++)运算:引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

  • 没有NULL引用,但有NULL指针

  • 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位平台下占8个字节)。

  • 有多级指针,但是没有多级引用。

  • 访问实体方式不同,指针需要显式解引用,引用则为编译器处理。

 因为引用必须被初始化,还不可以被更改等一些特性,造就了引用相对于指针更安全


⌛️ inline内敛函数

 在C语言中,宏是一种预处理指令,它提供了一种方便的宏定义和替换的方式。宏的作用主要是增强代码的复用性,提高性能。例如:一个加法函数就可以被写为#define Add(x,y) ((x)+(y)),这种方式不用创建栈帧,可以提高性能 。但是,宏也有缺点,容易出错,语法细节多,没有类型安全的检查,而且也不方便调试(预编译阶段进行了替换)。

 C++中除了使用const 和 enum 的方式来代替宏之外,还可以使用内联函数。

 用inline修饰的函数就叫做内联函数,内联函数通常是为了提高程序的执行效率而设计的,编译时,C++编译器会在调用内联函数的地方展开,不会开辟栈帧,避免了函数调用的开销,从而提升程序运行的效率。

特性:

 内联函数是一种空间换时间的方式,虽然没有函数调用的开销,但是增加了文件的大小。

 需要注意,内敛函数不可以声明和定义分离。内敛函数的地址是不进入符号表的,如果函数的定义和调用不在同一个文件,在链接环节中,符号表里找不到函数的地址就会报错。因此,编译器需要在编译时能够访问到函数的完整定义,所以建议将内敛函数的定义和声明都写入头文件中

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同。如果内敛函数较长,或为递归函数,这些请求可能会被编译器忽略。也就是说,是否展开是由编译器决定的


⌛️ auto关键字

 在C++中,auto是一个关键字,它用于声明变量的类型。auto关键字可以使编译器根据变量的初始值自动推断其类型。这也就说明了使用auto定义变量时必须对其进行初始化,auto x; //无法通过编译

 当一个对象的类型较长,使用auto就会很方便。

📙用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&

📙当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    auto x = 3, y = 4;
	
	auto a = 3.0 , b = 4; //类型不同,会编译失败,

注意:

  • auto不可以作函数的参数和返回值,因为编译器无法对形参的实际类型进行推导。auto Fun(auto x) {} //错误使用示例
  • auto不能直接用来声明数组,auto arr[] = { 1,2,3 };//错误使用示例

⌛️ 基于范围的for循环

 基于范围的for循环是C++11引入的一种新特性,用于简化对容器(如数组、向量、列表等)中元素的遍历。

语法:
 for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

for (auto element : container)
{  
   // 操作element  
}
#include<iostream>

using namespace std;

int main()
{
	int arr[] = { 1,2,3,4,5,6 };
	//依次取数组中元素赋值给x

	for (int x : arr)//不会改变数组的值
	{
		cout << x << ' ';
	}
	//自动判断结束,自动++往后走
	cout << endl;

	
	for (int& x : arr)//使用了引用,可以改变数组的值
	{
		x++;//对数组每个元素++
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

注意:for循环迭代的范围必须是确定的,对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。


⌛️ 空指针nullptr

 在C语言中,如果出现了一个未初始化的指针,没有合适的指向一般会赋NULL以防止形成野指针。

 C语言中的NULL实际上是一个宏,被定义为0。在一些特殊的情况下会出问题。例如:

 编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0

 在C++11中,将nullptr作为关键字引入,它表示一个空指针。为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr


❤️ 结语

 文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

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

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

相关文章

LED植物生长灯怎么做更有效?聚光和散热不能少!

如何选择一款更有效的植物生长灯呢&#xff1f;相信这是很多朋友关心的问题。 其实方法很简单&#xff0c;以主流的LED植物生长灯为例&#xff0c;想要植物灯更有效、更好用&#xff0c;需要关注其是否有光学透镜和散热技术。 光学透镜对植物生长灯有什么样的作用&#xff1f…

OpenHarmony Ohpm安装历程(个人踩坑,最后安装成功)

大家好&#xff0c;我是【八戒&#xff0c;你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享&#xff0c;请大家多多指教 目录 问题描述&#xff1a; 尝试解决 尝试一、 尝试二、 尝试三、 最终解决方案 问题描述&#xff1a; 当我学习到使用OpenHarmony的三方…

儿童家居服 I 童年很短不留遗憾,尽情打扮

厚实细腻的双面北极绒面料 软糯亲肤&#xff0c;上身效果极佳 经典宽松版型&#xff0c;对身材的包容性很强 帽子上的小熊刺绣精致又可 袖口处还有小熊掌的刺绣哦 松紧裤腰和束脚设计&#xff0c;防风保暖做到实处 这么好看又保暖的家居服喜不喜欢呢

中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)

中间件安全&#xff1a;Apache Tomcat 弱口令. Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登录后台&#xff0c;部署 war 包…

TDengine TSZ 压缩算法优化背后的故事,要从一篇学术论文说起

TSZ 压缩算法是 TDengine 提供的一种可选压缩算法&#xff0c;专门用于浮点数据类型。它具有出色的压缩性能&#xff0c;能够在有损和无损状态下都提供更高的压缩率&#xff0c;甚至比默认压缩算法高出一倍&#xff0c;满足更高的数据存储需求。利用数据预测技术&#xff0c;TS…

Idea 2023.2.5配置(插件、Maven等)

IDEA2023.2.5配置 一. 插件Alibaba Java Coding Guidelines plugin supportMaven HelperMyBatisXSonarLintTranslationVuesion Theme 二. 自定义创建live template&#xff0c;快速写代码三. 修改全局配置3.1 Maven配置3.1.1 安装MavenStep1. 下载Step2. 安装Step3. 创建系统环…

百度爬虫的工作原理解析

百度作为中国最大的搜索引擎&#xff0c;其工作原理备受关注。本文将深入探讨百度爬虫的工作原理&#xff0c;介绍其基本流程以及关键技术&#xff0c;帮助读者更好地理解搜索引擎背后的技术核心。 百度爬虫是百度搜索引擎的重要基石&#xff0c;它们被广泛用于收集互联网上的网…

桶装水订水小程序开发搭建;

水厂订水送水小程序是一款便捷的水产品订购与配送应用&#xff0c;基于小程序平台&#xff0c;用户可以轻松浏览、选购各类水产品&#xff0c;如矿泉水、纯净水、桶装水等&#xff0c;并享受送货上门服务。下面我们详细介绍它的主要功能。 一、丰富的商品展示 订水送水小程序汇…

多表查询内连接、外连接、子查询、笛卡尔积

1.1 多表查询&#xff1a;从多张表中进行查询 仅仅使用select * from tb_emp,tb_dept查询语句会显示如下结果&#xff08;笛卡尔积&#xff1a;两个表的所有的组合情况&#xff09;其中很大部分数据是冗余的。 1.2内连接&#xff1a;相当于查询A,B表交集部分的数据&#xff08…

stable-diffusion-webui之webui.py

主要就是webui的启动这块&#xff0c;需要初始化的地方&#xff0c;东西还是挺多的。

如何从零开始制作一本企业宣传画册?

最近公司领导要求为公司制作一本企业宣传画册&#xff0c;用来展示我们的产品和服务&#xff0c;增加品牌影响力。可是&#xff0c;像我这种零基础的小白&#xff0c;完全不知道如何制作啊&#xff1f;对此我感到很焦虑&#xff0c;怕做不好影响公司形象&#xff0c;也怕耽误时…

MIUI查看当前手机电池容量

MIUI查看当前手机电池容量 1. 按如下步骤操作生成bug报告 2. 按如下操作解压bug报告 Last learned battery capacity

深入理解 synchronized 原理

目录 一. 前言 二. Java对象的内存布局 2.1. 对象头 2.2. Mark Word 2.3. Class Metadata Pointer 2.4. Length 三. 偏向锁 3.1. 偏向锁的工作流程 3.2. 偏向失效 3.2.1. 误区一 3.3. 偏向撤销 3.3.1. 误区一 3.4. 偏向撤销的底层实现 3.5. HashCode与偏向撤销 …

[Kettle] 获取系统信息

系统信息是指Kettle系统环境的信息&#xff0c;包括了计算机系统的日期、星期等时间类型信息&#xff0c;计算机名称、IP地址等设备信息&#xff0c;Kettle系统转换过程中的信息等 需求&#xff1a;为方便读取计算机上的本月最后一天的交易数据文件&#xff0c;需要通过获取系…

词向量笔记

一、词向量的世界排名比赛MTEB MTEB: Massive Text Embedding Benchmark 二、词向量的维数 词向量的维数d1一般取20~500之间

不标年份的葡萄酒质量好吗?

我们在葡萄酒标上经常看到生产年份&#xff0c;也就是指全部葡萄采摘的年份。旧世界葡萄酒产国认为葡萄酒年份对他们的影响较大&#xff0c;而新世界葡萄酒&#xff0c;年份的意义就稍微小些。甚至有一部分葡萄酒酒标上没有年份。在酒标上没有标注年份的葡萄酒&#xff0c;被称…

ELK企业级日志分析平台

目录 一、elasticsearch 1、集群部署 2、cerebro部署 3、elasticsearch-head插件部署 4、elasticsearch集群角色分类 二、logstash 1、部署 2、elasticsearch输出插件 3、file输入插件 4、file输出插件 5、syslog 插件 6、多行过滤插件 7、grok过滤 三、kibana数…

网络工程师-HCIA网课视频学习

这里是速成的&#xff0c;只积累下&#xff0c;自己未曾学习到的东西。通过书本补充知识点。 视频&#xff1a;hcia17-链路聚合_哔哩哔哩_bilibili hcia16-路由高级特性&#xff1a; hcia17-链路聚合&#xff1a; 由于如果根据视频来学习的话&#xff0c;感觉视频的总结并不…

什么牌子的猫罐头好?性价比高的猫罐头推荐

很多铲屎官遇到过这样的问题&#xff01;他们购买了各种高质量的猫罐头&#xff0c;但猫咪却不吃或者吃了一段时间后出现软便等身体不适的情况。 作为一个担任了6年铲屎官的人&#xff0c;我对猫咪的日常饮食有着一定的了解。我给我家的猫咪尝试过很多种罐头。在这里&#xff0…

行情分析 - - 加密货币市场大盘走势(11.20)

大饼还是之前的策略&#xff0c;37000附近入场空单合适&#xff0c;目前4小时级别即将形成死叉&#xff0c;入场空单收益较大。 空单策略&#xff1a;入场37000附近 止盈34000-33000 止损39000 以太按照预期回调&#xff0c;笔者已经在1920打了止盈&#xff0c;目前没有入场&a…