【落羽的落羽 C++】C++入门基础:引用,内联,nullptr

文章目录
- 一、引用
- 1. 引用的概念
- 2. 引用的特点
- 3. 引用的使用
- 4. const引用
- 5. 引用和指针
- 二、inline内联
- 三、nullptr
一、引用
1. 引用的概念
引用是C++中的一个较为重要的概念。它是给已存在变量取的“别名”,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间。比如,“萨姆”是流萤的别名,“萨姆”就是对流萤的引用,当我们称呼萨姆时,指的仍然是流萤这个人。
具体用法是:类型& 引用别名 = 引用对象;
int a = 1;
//b和c是对a的引用,b和c都是a的别名
int& b = a;
int& c = a;
//也可以再对b取别名d,d还是对a的引用,也是他的别名
int& d = b;
可以看到:
b,c,d的值与地址和a是完全相同的:

2. 引用的特点
使用引用时,我们需要注意:
- 引用在定义时必须初始化。
- 一个变量可以有多个引用。
- 引用变量只能引用定义时指定的对象,无法修改引用对象。
- 因为它们共用一块地址,所以对引用变量的修改也会改变引用对象。
int a = 1;//没有初始化,会报错:
int& b;//一个变量可以有多个引用:
int& b = a;
int& c = a;
//后续无法再修改b和c的引用对象了//对引用变量的修改会改变引用对象:
b = 2; //a,b,c的值变成了2
int d = 3;
c = d; //这里并非是引用,而是赋值。a,b,c的值变成了3
3. 引用的使用
引用在实践中主要用于引用传参和引用做返回值。
引用传参,例如void Swap(int& x, int& y);,函数的形参是引用类型。在调用函数时,x和y分别是对实参的引用,在函数内部交换了x和y的值,也就改变了实参的值。显然,引用传参和传址调用一样,规避了传值调用中无法改名实参的缺点。引用传参和指针传参在功能上是类似的,引用传参相对更方便一点。
引用做返回值的使用涉及到类和对象的概念。简单概括,用普通类型做返回类型,返回值就只是一个常量数值,后续不能再对这个数值进行修改;用引用类型做返回类型,返回值就是函数内return的变量的引用,后续还可以对这个变量进行修改。以后我们再深入学习。
4. const引用
一个const变量也可以引用,但必须用const引用(常引用)。const引用也可以引用普通变量,但普通引用不能引用const变量。


当然,被const修饰了,const引用类型自然也不能被修改:

需要注意的是,类似a*2,20这种具有常性的对象,也必须要用常引用:

5. 引用和指针
C++中指针和引用很相似,在实践中它们相辅相成,功能有重叠,但是各有特点,不能互相替代。
- 引用是给一个变量起别名,不额外开辟空间。指针是存储一个变量的地址,要开空间。
- 引用在定义时必须要初始化。指针建议初始化,但在语法上不是必须的。
- 引用在初始化时引用一个对象后,就不能再改变引用对象。而指针可以不断改变指向对象。
- 引用可以直接访问引用对象。指针需要解引用才能访问指向对象。
- 引用变量的大小取决于引用类型。指针变量大小始终是4或8个字节。
- 指针很容易出现空指针和野指针的问题。引用使用起来更安全一点。

二、inline内联
inline是C++中的一个关键字,用来修饰函数。用inline修饰的函数叫做内联函数,编译时C++编译器会在调用函数的地方展开内联函数,这样调用函数时就需要建立栈帧了,可以提高效率。
但inline对于编译器而言只是一个建议,加了inline编译器也可以选择不展开函数,C++没有明确规定展不展开。inline适用于频繁调用的短小函数,对于递归函数或代码相对多一些的函数,加上inline也会被忽略。
当然,C语言中的宏函数也会在预处理时替换展开,但是宏函数在实现中很复杂容易出错,且不容易调试。C++设计出inline的目的就是替代C语言的宏函数。
VS编译器debug版本下是默认不展开inline的,这样方便调试,debug版本想要inline展开需要额外设置。
最后,inline不建议声明和定义分离到两个文件,这样会导致链接错误。因为inline被展开,函数地址没有了,链接时会出现报错。
#define Add(x, y) ((x)+(y)) //宏函数inline int Add(int x, int y) //内联函数
{return x + y;
}
换言之,内联函数像宏函数一样直接在函数调用处展开。它继承了宏函数的优点,但没有宏函数的缺点。
三、nullptr
我们对空指针NULL已经不陌生了。NULL实际上是一个宏,在传统的C头文件stddef.h中,可以找到:

C语言中,NULL被定义成无类型指针(void*)的常量。在C++中,NULL被定义成字面常量0,不论采用哪种定义,在使用NULL时,都可能会遇到问题,比如:
void Fun(int* ptr);
void Fun(int x);
这两个函数构成了函数重载,编译时没有问题。
假如后续调用中有Fun(NULL);,我们本想调用参数是int*的Fun函数,但由于NULL被定义成0,会调用成参数是int的Fun函数;写成Fun((void*)NULL),调用会报错;写成Fun((int*)NULL);才能调用第一个Fun函数:

所以,为了解决这个问题,C++11中引入了nullptr。nullptr是一个关键字,它是一种特殊类型的字面量,可以转换成任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能隐式地转换为指针类型,不能转换为整数类型。


本篇完,感谢阅读
相关文章:
【落羽的落羽 C++】C++入门基础:引用,内联,nullptr
文章目录 一、引用1. 引用的概念2. 引用的特点3. 引用的使用4. const引用5. 引用和指针 二、inline内联三、nullptr 一、引用 1. 引用的概念 引用是C中的一个较为重要的概念。它是给已存在变量取的“别名”,编译器不会为引用变量开辟内存空间,它和它引…...
Android 低功率蓝牙之BluetoothGattCallback回调方法详解
BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗(BLE)设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析: 1. onConnectionStateChange 触发时机&am…...
PHP之字符串拼接
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于字符串拼接的信息。 特别注意方法一,在别的语言中基本都是用拼接的。 方法一:(直接拼接) $x 123; echo "hello" . $x;方法二:(多输出拼接) …...
Python的那些事第四十一篇:简化数据库交互的利器Django ORM
Django ORM:简化数据库交互的利器 摘要 随着互联网技术的飞速发展,Web开发越来越受到重视。Django作为一款流行的Python Web框架,以其高效、安全、可扩展等特点受到了广大开发者的喜爱。其中,Django ORM(对象关系映射)是Django框架的核心组件之一,它为开发者提供了一种…...
通过多线程同时获取H264和H265码流
目录 一.RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程编辑编辑 1.1初始化VI模块: 1.2H264、H265的VENC模块初始化: 1.3VI分别绑定H264的VENC层和H265的VENC层: 1.4开启H264线程采集H264的VENC数据ÿ…...
DeepSeek V3 源码:从入门到放弃!
从入门到放弃 花了几天时间,看懂了DeepSeek V3 源码的逻辑。源码的逻辑是不难的,但为什么模型结构需要这样设计,为什么参数需要这样设置呢?知其然,但不知其所以然。除了模型结构以外,模型的训练数据、训练…...
海量数据融合互通丨TiDB 在安徽省住房公积金监管服务平台的应用实践
导读 安徽省住房公积金监管服务平台通过整合全省 17 家公积金中心的数据,致力于实现数据共享、规范化管理与高效数据分析。为了应对海量数据处理需求,安徽省选择 TiDB 作为底层数据库,利用其分布式架构和 HTAP 能力,实现了快速的…...
Sqlserver安全篇之_手工创建TLS用到的pfx证书文件
Sqlserver官方提供的Windows Powershell脚本 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 # Define parameters $certificateParams {Type "SSLServerAuthentication"Subje…...
Linux12-UDP\TCP
一、UDP 1.特点: 尽最大努力交付,存在丢包的可能 无连接 面向数据报 机制简单,传输效率高 2.应用场景: 1.画面传输 VNC 直播:要求实时性高、允许数据丢失、 二、TCP 1.特点: 面向数据流(流式套接字) 建立连接 安全可靠的传输协议 三次握手:TCP建立连接时,…...
Tailwind CSS 问题:npm error could not determine executable to run
问题与处理策略 问题描述 npx tailwindcss init -p在使用 Tailwind CSS 的前端项目中,执行上述指令,即初始化 Tailwind CSS 时,报如下错误 npm error could not determine executable to run# 报错npm 错误无法确定要运行的可执行文件问题…...
C# 实现鼠标轨迹录制与回放自动化功能(附源码)
在软件自动化测试或者重复性办公任务中,鼠标操作的自动化可以大大减少人工干预,提高工作效率。这里将详细介绍如何使用 C# 实现鼠标轨迹的录制与回放功能,代码结构清晰,具有较强的扩展性。 引用 NuGet 包 在开发这个功能时&…...
【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式
与设计模式相处:真实世界中的设计模式 设计模式是软件开发中的经典解决方案,它们帮助我们解决常见的设计问题,并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中,作者通过生动的案例和通俗的语言,深入…...
自由学习记录(42)
可能会出现到后面没有教程可以看,走不动,,但还是尝试吧 过程远比想象的要多 那连Live2d的这些脚本怎么控制的都要了解一下 ------------ 文件类型和扩展名 | 编辑手册 | Live2D Manuals & Tutorials 全部导入之后 在这下载SDK Live2D…...
mac安装nvm=>node=>nrm
下载并安装 NVM 运行以下命令下载并安装 NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash 配置环境变量 vim ~/.zshrc 按 i 将如下代码复制进去,controlc ,再按 :wq完成编辑 export NVM_DIR…...
excel vlookup的精确查询、模糊查询、反向查询、多列查询
目录 入门 精确查询 模糊查询 反向查询 (搭配 if 函数) 多列查询 (搭配 match 函数) 入门 精确查询 需求: 查找 学生编号是008 所在的班级 操作: 在I2单元格输入公式如下,VLOOKUP(H2,B1:E12,4,FALSE), 得出结果 看一下vlookup 公式每一个参数应该怎么写? 语法: vlookup…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
【Python爬虫】利用代理IP爬取跨境电商AI选品分析
引言 随着DeepSeek的流行,越来越多的用户开始尝试将AI工具融入到日常工作当中,借助AI的强大功能提高工作效率。最近又掀起了一波企业出海的小高潮,那么如果是做跨境电商业务,怎么将AI融入工作流中呢?在做跨境电商的时候…...
捣鼓180天,我写了一个相册小程序
🙋为什么要做土著相册这样一个产品? ➡️在高压工作之余,我喜欢浏览B站上的熊猫幼崽视频来放松心情。有天在家族群里看到了大嫂分享的侄女卖萌照片,同样感到非常解压。于是开始翻阅过去的聊天记录,却发现部分图片和视…...
Linux 上离线安装 python3
在Linux系统上进行离线安装 Python3,通常是因为目标机器没有网络连接。以下是一个通用的步骤指南,帮助你在这种情况下成功安装Python 3: 下载安装包 选择一台有网络连接的机器:这台机器的操作系统应该尽可能与目标机器相同或相似…...
洛谷 P1480 A/B Problem(高精度详解)c++
题目链接:P1480 A/B Problem - 洛谷 1.题目分析 1:说明这里是高精度除以低精度的形式,为什么不是高精度除以高精度的形式,是因为它很少见,它的模拟方式是用高精度减法来做的,并不能用小学列竖式的方法模拟…...
图像滑块对比功能的开发记录
背景介绍 最近,公司需要开发一款在线图像压缩工具,其中的一个关键功能是让用户直观地比较压缩前后的图像效果。因此,我们设计了一个对比组件,它允许用户通过拖动滑块,动态调整两张图像的显示区域,从而清晰…...
电商行业门店管理软件架构设计与数据可视化实践
一、行业痛点与核心诉求 在电商多平台运营成为主流的背景下,企业普遍面临三大管理难题: 数据碎片化:某头部服饰品牌2023年运营报告显示,其分布在8个平台的162家门店,日均产生23万条订单数据,但财务部门需要5个工作日才能完成跨平台利润核算。成本核算失真:行业调研…...
基于Arcgis的python脚本实现相邻矢量面的高度字段取平均值
文章目录 背景效果实现逻辑步骤1、准备数据2、python脚本3、执行通过脚本工具箱来执行背景 在地理信息系统(GIS)数据处理或三维建模等实际应用场景中,我们常常会遇到需要对矢量面数据进行精细化处理的需求。其中一个常见的任务便是对相邻的矢量面中的高度字段开展特定操作。…...
基于uniapp的蓝牙打印功能(佳博打印机已测试)
相关步骤 1.蓝牙打印与低功耗打印的区别2.蓝牙打印流程2.1 搜索蓝牙2.2 连接蓝牙 3.连接蓝牙设备4.获取服务5.写入命令源码gbk.jsglobalindex.ts 1.蓝牙打印与低功耗打印的区别 低功耗蓝牙是一种无线、低功耗个人局域网,运行在 2.4 GHz ISM 频段 1、低功耗蓝牙能够…...
Golang的网络流量控制
# Golang的网络流量控制 什么是网络流量控制? 网络流量控制是指针对网络数据传输过程中的流量进行管理和调控的一种技术手段。通过网络流量控制,我们可以对网络中的数据传输速率、带宽使用情况、数据包丢失率等进行监控和调整,以达到优化网络…...
在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...
Python教程(一):基本语法、流程控制、数据容器
Python(一) 文章目录 Python(一)一、基础语法二、数据类型2.1 字符串2.2 空值2.3 类型转换&运算符 三、流程控制3.1 条件判断3.2 循环3.2.1 while循环3.2.2 for循环 四、数据结构4.1 字符串str4.1.1 字符串的格式化输出4.1.1.…...
Spring Boot 3.x 核心注解详解与最佳实践
Spring Boot 3.x 核心注解详解与最佳实践 前言 随着Spring Boot 3.x的正式发布,这个基于Spring Framework 6的里程碑版本带来了诸多新特性。本文将深入剖析Spring Boot 3.x的核心注解体系,结合代码示例讲解其作用及使用场景,助您快速掌握新…...
【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...
Windows下安装VMware Workstation 17并设置支持MacOS
VMware Workstation 17 介绍 VMware Workstation 17 是 VMware 公司推出的一款强大的桌面虚拟化软件,适用于 Windows 、 Linux 和FreeBSD等操作系统。它允许用户在单一物理计算机上创建、运行和管理多个虚拟机(VM),每个虚拟机都可…...
