c++入门语法—————引用,内联函数,auto关键字,基于范围的for循环,nullptr

news2024/11/17 21:36:49

文章目录

  • 一.引用
    • 1.引例
    • 2.注意事项
    • 3.应用场景
      • 1.做参数(a:输出型参数b:内容较大参数)
      • 2.做返回值(a:修改返回值,b:减少拷贝)
    • 4.引用和指针的区别
  • 二.内联函数
    • 1.为什么有内联函数
    • 2.用法和底层
    • 3.特性
  • 三.auto关键字
    • 1.基础示例
    • 2.弊端
  • 四.for循环
  • 五. nullptr

一.引用

1.引例

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
语法:

数据类型+&+别名=原数值

如以下例子:

int main()
{
	int a = 10;
	int& b = a;
	return 0;
}

vs调试结果:

在这里插入图片描述
显然在语法层面,a和b的地址和数值大小完全一致。

2.注意事项

  • 引用必须初始化,不能空定义一个引用,然后引用。
    在这里插入图片描述
    在这里插入图片描述
  • 引用不同于指针,一旦引用不能中途更换指向。
int main()
{
	int a = 10;
	int c = 20;
	int& b = a;
	b = c;
	return 0;
}

在这里插入图片描述
这里只是赋值而不是重引用

  • 一个变量可以有多个引用多个别名,也可以给引用在引用。
    在这里插入图片描述
  • 不可修改的常量不能被引用
    在这里插入图片描述

3.应用场景

值得注意的是引用和指针在许多场景功能是重复的,但又各自有独特的妙用

1.做参数(a:输出型参数b:内容较大参数)

  • a:
    输出型参数是一种函数参数,用于在函数调用结束后将结果传递出来。这种参数通常用于返回函数的计算结果或状态信息。
    如交换函数:
void Swap(int& x, int& y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 10,  b = 20;
	cout << a<< "  " << b << endl;
	Swap(a, b);
	cout << a <<"  "<<   b << endl;
	return 0;
}

在这里插入图片描述

  • b:

使用引用做参数,在语法层面就少去了函数传参,进行临时拷贝这一过程,所以增加了效率

2.做返回值(a:修改返回值,b:减少拷贝)

在讲用法之前,我需要细说一下函数返回值是如何传回主函数的。系统知识我会后续推出函数栈帧的创建与销毁。

int Func()
{
	int a = 10;
	return a;
}
int main()
{
	cout << Func() << endl;
}

在主函数内调用Func()函数,需要开辟一块内存称为Func()的函数栈帧。
在c/c++中,局部变量储存在栈中,随着函数生命周期结束,栈帧也随之销毁,在程序后期这片内存会清理分配给其他局部变量使用
在这里插入图片描述
由此可见,虽然是return ,但返回的也是一份拷贝,并不是a这个量

  • 错误写法:
int& Func()
{
	int a = 10;
	return a;
}

在这里插入图片描述

在代码量较少函数栈区未清理时,会存在正确情况,但一旦清理,将意味着引用将指向一个无效的内存地址。这将导致未定义的行为,可能会导致程序崩溃或产生不可预测的结果。

  • 所以引用返回值,在堆区使用更加合理,脱离了局部变量返回的束缚:
int& Func(int x)
{
	int* a = (int*)malloc(sizeof(int)*10);
	for (size_t i = 0; i < 10; i++)
	{
		a[i] = i;
	}
	return a[x];
}

在这里插入图片描述

4.引用和指针的区别

  • 语法:
    1.引用是别名不开空间,指针是地址需要开空间
    2.引用必须初始化,指针不要求
    3.引用不能改变指向,指针可以
    4.引用相对更安全没有空引用,指针有空指针,野指针。
    5.sizeof()内的意义,引用指指向的值,指针则指本身指针大小
    6.引用没有±数值的用法
  • 底层:
    在汇编代码角度二者实现方法是相同的,都是指针,都需要开空间

二.内联函数

1.为什么有内联函数

内联函数(inline function)是一种在调用处直接展开执行的函数。在C++中,使用关键字inline声明的函数就是内联函数。内联函数的目的是减少函数调用的开销,提高程序的执行效率。

内联函数通常适用于函数体较小且频繁调用的情况,可以减少函数调用时的开销,但也可能增加代码的大小。

内联函数的定义通常放在头文件中,以便在需要的地方直接展开执行。
在c语言中我们通常使用宏替换去写频繁调用的小函数,不建立函数栈帧。

宏的缺点:
1.语法复杂,不易控制
2.本质是替换,不能调试
3.没有类型安全检查

所以c++中引入了内联函数的概念

2.用法和底层

  • 在未使用内联
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(1, 2);
	return 0;
}

在这里插入图片描述
call代表调用函数,证明此时建立了函数栈帧

  • 使用内联函数
inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(1, 2);
	return 0;
}

在需要展开的函数前加上inline
在这里插入图片描述
这里就没有call指令,即没有调用函数栈帧

3.特性

inline本质为空间换时间,但是一旦函数大小过大,编译器将自动忽略内联不在展开,防止代码膨胀。所以超过范围大小的,和递归类型的函数不适用于内联。

多文件项目函数实现的方法:
1.声明和定义分离
2.static静态实现函数
3.inline函数展开

前两种方法适用于大一些的函数,第三种适用于短小型函数。

三.auto关键字

auto关键字通常用于声明变量,它让编译器根据变量的初始化值自动推断出变量的类型。这样可以简化代码,减少重复输入类型名称的工作量。
在C++11及以后的标准中,auto关键字还可以用于迭代器的声明和lambda表达式的返回类型推断。

1.基础示例

void  func(int x, int y)
{
	return;
}

int main()
{
	void(*pf1)(int ,int) = func;//函数指针
	auto pf2 = func;//自动推导
	cout << typeid(pf1).name ()<< endl;
	cout << typeid(pf2).name() << endl;
	return 0;
}

在很长的函数指针定义时很复杂,所以可以使用auto自动推导
typeid是C++中的一个操作符,用于获取一个对象的类型信息。
在这里插入图片描述

2.弊端

过分使用auto,会误导程序员的判断,相当于一些关键信息会被省略,建议慎用。

四.for循环

C++11引入了范围for循环,它提供了一种简洁的方法来遍历容器、数组或其他可迭代对象的元素。范围for循环的语法如下:

for (auto element : container) {
    // 在这里使用 element
}

其中,auto关键字用于自动推断element的类型,container是要遍历的容器或可迭代对象。在循环的每次迭代中,element将依次代表container中的每个元素,直到遍历完所有元素为止。
日常使用中,这里容器可指数组,所以在c++中遍历数组又有了更简洁的使用方法。

int main()
{
	int arr[5] = { 1,2,3,4,5};
	
	for (auto e : arr)
	{
		//遍历数组
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
注意的一点:这里的e是对数组元素的一份临时拷贝,修改e对数组无效
那么怎么修改呢我们可以尝试使用引用对数组元素取别名
在这里插入图片描述

五. nullptr

在c++98中有一个bug,将NULL直接宏定义为0,所以在函数重载上会有误判。
在这里插入图片描述
如图所示,输出皆为第一个函数,并没有达到重载效果。
所以c++11,引入关键字nullptr进行修正。
在这里插入图片描述
本期文章就分享到这里,感谢收看!
在这里插入图片描述

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

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

相关文章

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案&#xff0c;开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞&#xff0c;该漏洞源于文件server/application/api/contr…

数据库之一 基础概念、安装mysql、sql语句基础

数据库之 基础概念、安装mysql、sql语句基础 【一】存储数据的演变过程&#xff1a; 文件存储&#xff1a; 初始阶段随意存放数据到文件&#xff0c;格式任意。目录规范引入&#xff1a; 软件开发使用目录规范&#xff0c;限制数据位置&#xff0c;建立专门文件夹。本地数据存…

inside 的坑

最近代码里面有一句inside 判断语句&#xff0c;明明条件满足&#xff0c;但是就是判断失败&#xff0c;代码如下&#xff1a; xxx;if(i inside {[7:0]}) begin //i5xxx;end xxx; 翻看sv 手册才发现 inside 后面跟的是range value&#xff0c;必须是从小写到大&#xff0c;也就…

腾讯云Linux(OpenCloudOS)安装tomcat9(9.0.85)

腾讯云Linux(OpenCloudOS)安装tomcat9 下载并上传 tomcat官网 https://tomcat.apache.org/download-90.cgi 下载完成后上传至自己想要放置的目录下 解压文件 输入tar -xzvf apache-tomcat-9.0.85.tar.gz解压文件&#xff0c;建议将解压后的文件重新命名为tomcat,方便后期进…

【vue】defineModel在vue3.4中的最新用法和详解

在2023年12月28日&#xff0c;尤大发布了vue3.4版本&#xff0c;这个版本主要对一些实验性特性的改进&#xff08;比如defineModel&#xff09;&#xff0c;大量重写了模板编译器并重构了响应式系统&#xff0c;可以说是大大提升了运行速度和效率。 之前在vue3.3中defineModel…

应急消防应用步入“繁花”时代,卓翼智能消防无人机顺势而行大有可为

近日&#xff0c;北京卓翼智能科技有限公司&#xff08;以下简称“卓翼智能”&#xff09;宣布完成超亿元B轮融资&#xff0c;融资金额高达2.5亿元。这个“智能无人系统”黑马品牌&#xff0c;凭什么出圈&#xff1f;重点发力在哪些领域呢&#xff1f;今天&#xff0c;带你走进…

Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1,Nginx动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化

1.Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1 1.1安装依赖 sudo apt install libgd-dev 1.2下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 1.3解压nginx tar -zvxf nginx-1.22.1.tar.gz 1.4编译安装 cd nginx-1.22.1 编译并指定安装位置&#xff0c;执行安装…

华为笔记本matebook pro X如何扩容 C 盘空间

一、前提条件 磁盘扩展与合并必须是相邻分区空间&#xff0c;且两个磁盘类型需要相同。以磁盘分区为 C 盘和 D 盘为例&#xff0c;如果您希望增加 C 盘容量&#xff0c;可以先将 D 盘合并到 C 盘&#xff0c;然后重新创建磁盘分区&#xff0c;分配 C 盘和 D 盘的空间大小。 访…

2024 新年HTML5+Canvas制作3D烟花特效(附源码)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Ajax入门与使用

目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX&#xff1f; 怎么发送 AJAX 请求&#xff1f; 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…

上海亚商投顾:创业板指创调整新低,全市场超4800只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;创业板指午后跌超3%&#xff0c;深成指跌超2%&#xff0c;北证50指数跌逾6%。中…

sqli-labs-master less-1 详解

目录 关于MySQL的一些常识 information_schema 常用的函数 sqli-labs-master less-1 分析PHP源码 测试 关于MySQL的一些常识 information_schema information_schema 是 MySQL 数据库中的一个元数据&#xff08;metadata&#xff09;数据库&#xff0c;它包含…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

Mybatis 获取自增主键ID的几种方式

Mybatis 获取添加的自增主键ID的几种方式 需求实现1. 使用 GeneratedKeys2. 获取 Sequence 序号3. 使用 selectKey 标签 需求 很多时候新增了一条数据之后&#xff0c;不仅要知道是否插入成功&#xff0c;还需要获取存入之后的主键id 以便后续使用。通常的办法是&#xff1a;先…

C# IP v4转地址·地名 高德

需求: IPv4地址转地址 如&#xff1a;输入14.197.150.014&#xff0c;输出河北省石家庄市 SDK: 目前使用SDK为高德地图WebAPI 高德地图开放平台https://lbs.amap.com/ 可个人开发者使用&#xff0c;不过有配额限制。 WebAPI 免费配额调整公告https://lbs.amap.com/news/…

ArcGIS Pro 如何计算长度和面积等数据?

要素的几何属性属于比较重要的信息&#xff0c;作为一款专业的GIS软件&#xff0c;ArcGIS Pro自然也是带有计算几何的功能&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的矢量数据&#xff0c;除了矢…

基于JAVA+SpringBoot+Vue的前后端分离的美食分享推荐平台2

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当今社会&#xff0…

对闭包的理解(闭包使用场景)

文章目录 一、是什么二、使用场景柯里化函数使用闭包模拟私有方法其他 三、注意事项 一、是什么 一个函数和对其周围状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组…

23种设计模式-结构型模式

1.代理模式 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。…

构建高效外卖系统:利用Spring Boot框架实现

在当今快节奏的生活中&#xff0c;外卖系统已经成为人们生活中不可或缺的一部分。为了构建一个高效、可靠的外卖系统&#xff0c;我们可以利用Spring Boot框架来实现。本文将介绍如何利用Spring Boot框架构建一个简单但功能完善的外卖系统&#xff0c;并提供相关的技术代码示例…