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.mzph.cn/news/655930.shtml

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

相关文章

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习&#xff08;线上&#xff09;&#xff0c;hr问我有没有相关经历&#xff0c;我说我会用jupyter book进行数据导入&#xff0c;清洗&#xff0c;可视化&#xff0c;特征工程&#xff0c;建模&#xff0c;python学和用的比较多&#xff0c;…

[计算机提升] 删除空间占用大的文件(夹)

5.3 删除空间占用大的文件(夹) 5.3.1 hiberfil.sys 说明&#xff1a; 该文件是系统休眠文件。 对策&#xff1a; 使用CMD命令&#xff1a;powercfg -h off关闭休眠&#xff0c;然后重启电脑后该文件则会自动删除。但是电脑以后没有了休眠功能。读者可以根据实际情况进行取舍。…

从理论到实践,如何用TRIZ破解研发中的技术难题?

自科技飞速发展以来&#xff0c;技术问题层出不穷&#xff0c;成为许多企业和研究机构研发过程中难以突破的瓶颈。然而&#xff0c;有一个强大的工具&#xff0c;能帮助我们解决这些问题&#xff0c;那就是TRIZ。 一、TRIZ是什么 TRIZ&#xff0c;全称是"发明问题解决理…

【Java程序设计】【C00178】基于SSM的NBA球队管理系统(论文+PPT)

基于SSM的NBA球队管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的NBA球队管理系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首页…

AMC系列可编程智能电测仪表功能以及选型

功能&#xff1a; AMC 系列可编程智能电测仪表是针对电力系统、工矿企业、公用设施、智能大厦的电力监控需求而设计的智能仪表&#xff0c;它集成电力参数的测量(如单相或者三相的电流、电压、有功功率、无功功率、视在功率、频率、功率因数)以及电能监测和考核管理。采用高亮…

20240130在ubuntu20.04.6下给GTX1080安装最新的驱动和CUDA

20240130在ubuntu20.04.6下给GTX1080安装最新的驱动和CUDA 2024/1/30 12:27 缘起&#xff0c;为了在ubuntu20.4.6下使用whisper&#xff0c;以前用的是GTX1080M&#xff0c;装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080&#xff0c;需要将安装最新的545的驱动程…

精细化客户管理,这篇文章教会您!

如何做好客户精细化管理? 对于企业来说&#xff0c;不止要做到客户拉新&#xff0c;同时&#xff0c;也要做到让新客户变成老客户&#xff0c;让客户多次高频次购买。否则客户如果只是来购买一次&#xff0c;客户回购率低&#xff0c;长期以往&#xff0c;那企业的生存资本&a…

kubernetes-快速部署一套k8s集群

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 二进制包 从github下载发行…

《CSS3》田字网格背景(外实线内虚线)的实现

一、前言 记录一些有趣的CSS实现方式&#xff0c;总所周知&#xff0c;当一段效果可以通过CSS实现的时候&#xff0c;绝不使用Javascript来实现&#xff0c;因此记录一些有意思的CSS效果&#xff0c;一来是方便自己学习&#xff0c;另一来是方便以后在需要使用到的时候能快速找…

基于YOLOv8深度学习的水稻叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Vue3使用vant检索组件van-search的坑

当清空按钮与检索按钮同时居右时&#xff0c;点击clear清空按钮事件时会同时触发click-right-icon事件,如下配置&#xff1a; <van-searchv-model"form.search"show-actionshape"round"left-icon""right-icon"search"placeholder&…

Python(19)Excel表格操作Ⅰ

目录 导包 读取EXCEL文件 1、获取worksheet名称 2、设定当前工作表 3、输出目标单元格数据 4、工作表.rows&#xff08;行&#xff09; 5、工作表.columns&#xff08;列&#xff09; 小结 导包 要想使用 python 操作 Excel 文件&#xff0c;应当导入 openpyxl 包。在…

03:华为云管理|云主机管理|云项目实战

华为云管理&#xff5c;云主机管理&#xff5c;云项目实战 安全组配置部署跳板机配置yum源&#xff0c;安装软件包优化系统服务安装配置ansible管理主机 模版镜像配置配置yum源&#xff0c;安装软件包优化系统 网站云平台部署实战华为云的负载均衡 安全组配置 设置安全组 云…

【Docker】docker安装jenkins

一、执行命令 下载jenkins镜像 #下载jenkins 镜像 docker pull jenkins/jenkins:latest-jdk8 启动jenkins容器 #启动jenkins 容器 #挂载 如果不挂载 每次启动jenkins的配置、插件、用户等信息都没有了 #jenkins_home 包含jenkins配置、插件、用户等信息。 要指定必须配置用…

【AI视野·今日NLP 自然语言处理论文速览 第七十六期】Fri, 12 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 12 Jan 2024 Totally 60 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Axis Tour: Word Tour Determines the Order of Axes in ICA-transformed Embeddings Authors Hiroaki Yamagi…

linux离线升级openssh方法

检查openssh版本&#xff1a; 升级前openssh 版本为7.4 openssl 版本为1.0.2k Openssh9.6 所需openssl >1.1.1 因此openssl也需要升级。 为了防止升级失败&#xff0c;无法使用SSH登录&#xff0c;首先安装telnet 预防。查看是否安装了telnet 客户端及服务 未安装tel…

Java - JDBC

Java - JDBC 文章目录 Java - JDBC引言JDBC1 什么是JDBC2 MySQL数据库驱动3 JDBC开发步骤4 具体介绍 引言 思考: 当下我们如何操作数据库&#xff1f; 使用客户端工具访问数据库&#xff0c;手工建立连接&#xff0c;输入用户名和密码登录。编写SQL语句&#xff0c;点击执行…

Vue(十九):ElementUI 扩展实现树形结构表格组件的勾父选子、半勾选、过滤出半勾选节点功能

效果 原理分析 从后端获取数据后,判断当前节点是否勾选,从而判断是否勾选子节点勾选当前节点时,子节点均勾选全勾选与半勾选与不勾选的样式处理全勾选和全取消勾选的逻辑筛选出半勾选的节点定义变量 import {computed, nextTick, reactive, ref} from vue; import {tree} f…

解剖 Python 代码,深入学习 interpret 库的功能和应用!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python是一门广泛应用的编程语言&#xff0c;拥有丰富的标准库和第三方库&#xff0c;可以用于各种应用场景。在Python中&#xff0c;有一个名为interpret的库&#xff0c;它提供了一种强大的方式来处理和执行Py…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…