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

文章目录

  • 一.引用
    • 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.rhkb.cn/news/248235.html

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

相关文章

vue项目如何打包,java项目如何打包

目录 vue项目如何打包 java项目如何打jar包 使用Maven打包为JAR&#xff08;方式一&#xff09;视图&#xff1a; 先双击clean再双击package即可打包 使用Maven打包为JAR&#xff08;方式二&#xff09;命令&#xff1a; 1、确保你已经安装了Maven&#xff0c;并且配置了相应…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

GLog开源库使用

Glog地址&#xff1a;https://github.com/google/glog 官方文档&#xff1a;http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译&#xff0c;生成VS解决方案 &#xff08;1&#xff09;在glog-master文件夹内新建一个build文件夹&#xff0c;用…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

React进阶 - 14(说一说”虚拟DOM“中的”Diff算法“)

本章内容 目录 一、了解 Diff 算法二、key 值的重要性三、为什么不建议使用 index 做 key 值 上一节我们初步了解了 React中的”虚拟 DOM“ &#xff0c;本节我们来说一说”虚拟DOM“中的”Diff算法“ 一、了解 Diff 算法 在上一篇中&#xff0c;我们有讲到&#xff1a;当 st…

UE5 C++ 读取本地图片并赋值到UI上

目录 结果图 节点样式 主要代码 调试代码 结果图 节点样式 主要代码 &#xff08;注释纯属个人理解&#xff0c;可能存在错误&#xff09; // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h&q…

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

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

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

vue3-深入组件-透传属性

透传属性 &#xff08;透传 attribute&#xff09; 什么是透传属性&#xff08;透传 attribute&#xff09;? 传递给一个组件&#xff0c;却没有被该组件声明为 props 或 emits 的 attribute 或者是事件监听器&#xff0c;例如 class style id 等。 属性继承 当一个组件以单…

Android T 远程动画显示流程(更新中)

序 本地动画和远程动画区别是什么? 本地动画&#xff1a;自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画&#xff1a;拿来吧你&#xff01;一个app A对另一个app B通过binder跨进程通信&#xff0c;控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…

【C++】——类和对象(中)

一、前言 好久没有更新内容了&#xff0c;今天为大家带来类和对形中期的内容 &#xff01; 二、正文 1.this指针 1.1this指针的引入 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year …

el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来 需求 我们使用element-ui或者element-plus的时候会遇到树形控件的使用&#xff0c;我们使用树形控件会限制有的节点不让选中和高亮出来&#xff0c;这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus…

时序数据库 Tdengine 执行命令能够查看执行的sql语句

curl是 访问6041端口&#xff0c;在windows系统里没有linux里的curl命令&#xff0c;需要用别的工具实现。我在cmd里是访问6030端口 第一步 在安装是时序数据库的服务器上也就是数据库服务端 进入命令窗口 执行 taos 第二步 执行 show queries\G;

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

Microsoft Edge 浏览器报错 提示不安全

网站提示不安全 是因为 Microsoft Edge 开了安全过滤 我们需要把这个关掉 打开浏览器的设置&#xff0c;然后 找到隐私选项 找到下边的Microsoft Defender Smartscreen 关掉 Microsoft Edge 支持 Microsoft Defender SmartScreen | Microsoft Learn win10系统下打开网页提示…

Linux 系统相关的命令

参考资料 Linux之chmod使用【linux】chmod命令详细用法 目录 一. 系统用户相关1.1 查看当前访问的主机和用户1.2 切换用户1.2.1 设置root用户密码1.2.2 普通用户和root用户切换 1.4 系统状态1.4.1 vmstat 查看当前系统的状态1.4.2 history 查看系统中输入过的命令 二. 系统文件…

使用OpenCV实现一个简单的实时人脸跟踪

简介&#xff1a; 这个项目将通过使用OpenCV库来进行实时人脸跟踪。实时人脸跟踪是一项在实际应用中非常有用的技术&#xff0c;如视频通话、智能监控等。我们将使用OpenCV中的VideoCapture()函数来读取视频流&#xff0c;并使用之前加载的Haar特征级联分类器来进行人脸跟踪。 …

三步实现 Sentinel-Nacos 持久化

一、背景 版本&#xff1a;【Sentinel-1.8.6】 模式&#xff1a;【Push 模式】 参照官网介绍&#xff1a;生产环境下使用Sentinel &#xff0c;规则管理及推送模式有以下3种模式&#xff1a; 比较之后&#xff0c;目前微服务都使用了各种各样的配置中心&#xff0c;故采用Pus…

php怎么输入一个变量,http常用的两种请求方式getpost(ctf基础)

php是网页脚本语言&#xff0c;网页一般支持两种提交变量的方式&#xff0c;即get和post get方式传参 直接在网页URL的后面写上【?a1027】&#xff0c;如果有多个参数则用&符号连接&#xff0c; 如【?a10&b27】 post方式传参 需要借助插件&#xff0c;ctfer必备插…

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA&#xff1f; DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&…