从C++开始的编程生活(3)——引用类型、内联inline和nullptr

前言

本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~
第3篇主要讲的是有关于C++的引用类型内联inlinenullptr
C++才起步,都很简单呢!

目录

前言

引用类型

基本语法

特性

应用

const引用

基本语法

引用与指针的关系

内联inline

nullptr


引用类型

即对同一块连续存储空间,多取一个标识符(别名)语法上不开辟空间(但是汇编底层也是用指针实现的)

基本语法

int a = 0;
int& b = a;

如上,引用类型的定义方式为:类型& 引用别名 = 引用对象(“类型”,要与引用对象相同)。
这里表示引用b为a的别名
引用类型变量同原变量指向同一空间,即a,b都指向同一块空间。

int a = 0;
int& b = a;
int& c = a;
//也可以给别名取别名
int& d = c;
//运行代码,四次输出的地址都相同,可知引用类型与原变量a指向同一个地址
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;

而且,可以给别名起别名(如上代码)。
一个变量可以有多个别名

特性

①引用在定义时必须初始化
②一个变量可以有多个别名。
③引用不可以再改变指向。

应用

引用传参和引用做返回值的时候减少拷贝,从而提高效率。而且改变引用类型对象同时会改变被引用对象

struct A
{int arr[1000];//占用空间大
};
//不使用引用传参和指针传参
int Func(A aa)
{//此处需要拷贝一个占用较大的A类型,效率低return aa.arr[0];
}
int& Func2(A& aa)
{//此处返回值和传参都无需拷贝return aa.arr[0];//数组首元素
}
//并且,若修改返回的值,数组的首元素同时也会被修改。
int main()
{struct A aa;for (int i = 0; i < 1000; i++){aa.arr[i] = i;}//首元素为0,输出为1cout << ++Func2(aa) << endl;return 0;
}

首先,将返回值传回时,还会开辟一个临时对象存储返回值。这里使用了引用作返回值。
然后,将引用类型作为临时对象返回,无需再进行拷贝无需开辟空间,因为引用是被引用对象的别名,可以认为是同一个变量。
而且可以通过修改返回值,达到修改被引用对象的作用
调用Func2,可以Func2(aa)++,改变返回值,即可修改原数组的首元素
调用Func,Func(aa)++会报错,因为返回的是个int类型数据,他不是一个左操作数。


注意,不可以出现野引用现象(类似野指针)!!

const引用

const引用,用于引用const对象,也可以引用普通对象。(const对象,不可被赋值,必须初始化)

基本语法

const int a = 0;
const int& b = a;

引用const对象,要使用const引用。否则·······

这是一个关于访问权限的问题(指针和引用才有)。

访问权限演示
//①
const int a = 0;
//!!错误演示!!
int &b = a;//int&引用指向的对象是可以修改的,这里放大了访问权限
//!!正确演示!!
const int& ra = a;//②
int c = 10;
const int&rc = c;//该引用为访问权限为const,缩小了权限,是允许的
//因此↓
c++;//c可以被修改
rc++;//不可以通过rc修改c//③
double d = 12.34;
const int& rd = d;//d先要进行类型转换转为int,中间产生临时const对象,传给rd时要求rd也是const引用
void func(const int& rx)
{int ret = rx;return ret;
}
int e = 10;
const int& re = e * 10;//e * 10的中间结果为临时const对象,同上处理
func(e);//e的权限缩小为const
func(e * 3);//e * 3为临时const对象,函数传参要为const引用
//综上,类型转换、中间值、传参等情况可能会出现访问权限的问题

 C++在类型转换或者多次运算时,中间结果也为const对象

引用与指针的关系

①指针和引用相辅相成,各有特点,不可替代
②在语法上,引用不开辟空间存储指针变量要开辟空间存储
引用必须初始化指针可以不初始化(只是建议要初始化)。
引用可以直接访问对象指针还需要解引用
在sizeof中,表达含义不同,引用,则为所引用的类型的大小指针,则是指向地址空间的字节个数
指针容易出现空指针和野指针引用很少会出现野引用,引用使用起来更安全。
⑦因为引用在初始化之后就不可以再赋值,因此不可以用在链表等数据结构中

内联inline

inline修饰的函数,叫作内联函数。C++编译器会在调用的地方直接展开内敛函数。它设计的目的就是要平替C语言的宏避免宏的坑

注:define宏函数的使用要点
①宏函数最后,不可加分号

#define ADD(x, y) ((x)+(y));
cout << ADD(1,2) << endl;//会报错,展开后多了个分号

②宏函数需要加内部的括号
③宏函数需要加外部的括号
都是为了避免宏函数展开时,因运算符优先级的问题导致运算顺序没有满足实际需要,从而发生错误
宏函数的好处:函数展开,不需要开辟栈帧但是实现复杂容易出错展开后代码量大不可以调试
内联既保留了不用开辟栈帧的优点,而且没有宏的坑。

在vs编译器的debug版本下,内联默认不展开,inline修饰会忽略,这是为了能够展开调试(展开了就和宏一样无法调试了)。可以设置修改为不分内联函数展开,即只展开短小函数,递归函数等复杂函数不展开。

如图,可设置为简单inline函数展开。

究竟要多复杂的函数才会不展开呢?这取决于编译器自身,不同的编译器在这一点上就不同。在汇编层,不展开的内联函数会有call指令出现。

假设Add函数在汇编层内有100条指令,在工程中调用了10000次
若不展开,汇编层一共只有10000条call指令;
若展开,汇编层一共有100 * 10000条指令。
因此,若展开复杂函数,会让代码量剧增,会导致指令占用内存变多。

且内联函数不建议声明和定义分离在两个不同的文件上,可能会出现链接错误。因为内联函数没有地址。

nullptr

NULL在C++中为int类型的0,在C语言中为空指针,即void*类型。但在C++中void*不可以再转类型,这就导致无法实现泛式函数
nullptr为特殊关键字,可以转换为任意类型的指针,在C++中要用nullptr来定义空指针。

❤~~本文完结!!感谢观看!!欢迎来我博客做客~~❤ 

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

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

相关文章

makefile-- 其他函数

fuctionsjoin​$(join <list1>,<list2>)连接函数把list2 中单词对应的添加到list1 的后面若list1 的单词个数> list2 &#xff0c;多出的list1 保持不变若list2 的单词个数> list21&#xff0c;多出的list2 添加到list1 后面foreach​$(foreach <var>…

【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形

文章目录 前言 实战 1、实现要点 1.1 NavMesh.CalculatePath方法计算两个点之间的导航路径 1.2 寻找投射的地面点 2、代码实现如下 3、烘培地面导航网格 4、添加导航玩家代理,并挂载前面的脚本 5、创建Line Renderer,并放在角色下面作为子物体 6、运行游戏查看效果 专栏推荐 …

宝塔申请证书错误,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘

遇到"module OpenSSL.crypto has no attribute sign"错误时&#xff0c;通常是由于pyOpenSSL版本兼容性问题导致的‌。以下是解决方案&#xff1a;通过SSH连接到服务器&#xff0c;执行以下命令安装指定版本的pyOpenSSL&#xff1a;btpip install pyOpenSSL24.2.1-U然…

【ffmpeg源码学习】详解pkg-config的作用

文章目录 前言 一、什么是pkg-config? 二、为什么需要 pkg-config? 三、pkg-config 的工作原理 3.1 .pc 文件 3.2 查询流程 3.3 查找路径 四、pkg-config 在 FFmpeg 中的作用 五、pkg-config 的常用命令 六、在项目中的实际用法 6.1 makefile示例: 6.2 cmake示例: 6.3 gcc命…

PHPStorm携手ThinkPHP8:开启高效开发之旅

目录一、前期准备1.1 开发环境搭建1.2 配置 Xdebug二、PHPStorm 集成 ThinkPHP82.1 导入 ThinkPHP8 项目2.2 配置 PHP 解释器2.3 配置服务器三、ThinkPHP8 项目开发基础3.1 项目结构剖析3.2 控制器与方法创建3.3 视图渲染与数据传递四、数据库操作与模型定义4.1 数据库配置4.2 …

HTTP性能优化实战技术详解(2025)

HTTP性能优化实战技术详解本文基于提供的文章大纲&#xff0c;对HTTP性能优化进行扩展说明。文章结构清晰&#xff0c;从理解瓶颈到具体优化策略&#xff0c;再到监控与高级技巧&#xff0c;逐步展开。每个部分包括背景介绍、核心原理、实施步骤、示例或工具推荐&#xff0c;确…

探索文件系统:软硬链接的奥秘

目录 1.文件系统 1.1 磁盘物理存储结构 1.2 磁盘逻辑存储结构 1.3 inode编号 2. 软硬链接 2.1 软链接 2.2 硬链接 2.3 目录文件的软硬链接 1.文件系统 在一台电脑中&#xff0c;大部分文件都不是被打开的&#xff0c;这些文件都在磁盘中进行保存。已经打开的文件需要管…

3x3矩阵教程

3x3矩阵教程 1. 简介 三维矩阵是线性代数中的重要概念&#xff0c;用于表示三维空间中的线性变换。本教程将介绍如何使用C实现三维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度学习前置知识

文章目录介绍数据操作张量张量的定义1. **张量的维度&#xff08;Rank&#xff09;**2. **张量的形状&#xff08;Shape&#xff09;**简单的数据预处理&#xff08;插值线性代数微积分概率论1. 基本概念(1) 随机试验与事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS学习总结

一.XSS概述 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通过在网页上注入恶意脚本代码&#xff0c;从而在用户的浏览器上执行恶意操作。这些脚本可以是 JavaScript、HTML 或其他网页脚本语言。一旦用…

计算机网络中:传输层和网络层之间是如何配合的

可以把网络层和传输层想成一个“快递系统”&#xff1a; 网络层&#xff08;IP 层&#xff09; 邮政系统&#xff1a;只负责把“包裹”&#xff08;IP 数据报&#xff09;从 A 地搬到 B 地&#xff0c;不保证顺序、不保证不丢、不保证不重复。传输层&#xff08;TCP/UDP 层&am…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户登录实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解用户登录实现 视频在线地址&#xff1a; …

Redis主从复制数据同步实现原理详细介绍

文章目录一、主从复制的概念二、全量复制&#xff08;完整重同步&#xff09;三、增量复制&#xff08;部分重同步&#xff09;1. 增量复制的核心思想2. 增量复制的实现3. 复制偏移量&#xff08;replicationoffset&#xff09;4. 复制积压缓冲区&#xff08;replicationbacklo…

docker 软件bug 误导他人 笔记

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方随便修改安装命令&#xff0c;这个在4.4一下是无法使用的&#xff0c;存在误导他人

Python 进阶(六): Word 基本操作

目录 1. 概述2. 写入 2.1 标题2.2 段落2.3 表格2.4 图片2.5 样式 3. 读取 1. 概述 Word 是一个十分常用的文字处理工具&#xff0c;通常我们都是手动来操作它&#xff0c;本节我们来看一下如何通过 Python 来操作。 Python 提供了 python-docx 库&#xff0c;该库就是为 Wo…

OpenLayers 入门指南【三】:API概要

目录一、官方文档二、核心类三、总结一、官方文档 首页右侧有四个栏目分别是 Docs(文档):也可以理解为使用指南&#xff0c;涵盖一下四个模块 Quick Start(快速入门)&#xff1a;介绍如何快速引入并使用OpenLayers快速构建一个地图应用FAQ(问答)&#xff1a;介绍一些常见问题的…

JAVA面试宝典 -《Kafka 高吞吐量架构实战:原理解析与性能优化全攻略》

&#x1f680; Kafka 高吞吐量架构实战&#xff1a;原理解析与性能优化全攻略 随着大数据技术在日志收集、埋点监控、订单流处理等场景的普及&#xff0c;Kafka 已成为流处理架构中的核心组件。它之所以能在海量数据场景下保持高吞吐、低延迟&#xff0c;源于其在架构层面和底…

把sudo搞坏了怎么修复:报错sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的时候一不小心给/etc目录下所有的文件都所有者给改了&#xff0c;然后使用sudo的时候就出现了下面的问题&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端项目开发1.0.1版本

项目包含用户权限管理、表单提交、数据上传下载、仪表盘可视化等功能&#xff0c;非常适合新手从零开始学习Vue3前端开发&#xff0c;下述包含所有开发源代码&#xff0c;敬请食用 废话少说先上图: 登陆界面: 仪表盘管理系统: 用户管理: 对于普通用户只有仪表盘和个人信息界…

低代码平台能否完全取代传统前端开发

低代码平台不能完全取代传统前端开发&#xff0c;主要原因包括灵活性有限、性能优化能力不足、复杂定制需求难以实现。 低代码平台尽管能快速开发出相对标准化的应用&#xff0c;但在处理复杂、个性化的业务需求时&#xff0c;明显表现出不足。尤其在需要精细化控制UI界面、高性…