当前位置: 首页 > news >正文

【C++指南】C++中nullptr的深入解析

           💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

1b7335aca73b41609b7f05d1d366f476.gif

 

目录

引言

一、nullptr的引入背景

二、nullptr的特点

1.类型安全

2.明确的空指针表示

3.函数重载支持

4.与智能指针的交互

三、nullptr的用法

1.初始化指针

2.函数参数和返回值

3.与智能指针一起使用

4.模板代码中的使用

四、nullptr与NULL的比较

1.类型安全性

2.重载

3.可读性

结论


引言

在C++编程中,处理指针是常见的任务之一。然而,空指针(即不指向任何有效内存地址的指针)的处理尤为重要,因为它直接关系到程序的健壮性和安全性。C++11引入了一个新的关键字nullptr,用于表示空指针,这一改进极大地提升了代码的类型安全性和可读性。

本文将详细介绍nullptr的各个方面,包括其引入背景、特点、用法以及与旧式空指针(如NULL)的比较。

一、nullptr的引入背景

在C++11之前,空指针通常通过NULL宏来表示,这个宏在C和C++中被广泛定义为0或(void*)0。然而,这种表示方式存在一些问题:

  1. 类型不匹配:由于NULL可以被隐式转换为任何指针类型,同时也可能被解释为整数0,这可能导致类型混淆和难以发现的错误。
  2. 重载歧义在函数重载时,如果两个函数分别接受整数和指针类型的参数,而NULL被错误地传递给整数参数的函数,这种错误在编译时不会被捕获

为了解决这些问题,C++11引入了nullptr,作为一种新的空指针字面量,旨在提供一种类型安全的方式来表示空指针。

二、nullptr的特点

1.类型安全

nullptr的类型是std::nullptr_t,这是一个特殊的类型,专门用于表示空指针。nullptr只能被隐式转换为指针类型,而不能被转换为整数类型,这有效避免了类型不匹配的问题

2.明确的空指针表示

nullptr明确表示一个指针不指向任何对象,这种明确的表示方式提高了代码的可读性和可维护性。

3.函数重载支持

nullptr可以与函数重载一起使用,特别是当涉及到指针和整数类型的重载时,nullptr可以明确指定调用哪个版本的函数。

4.与智能指针的交互

nullptr可以与C++的智能指针(如std::unique_ptrstd::shared_ptr等)一起使用,用于初始化或表示智能指针不拥有任何资源的情况。

 

三、nullptr的用法

1.初始化指针

使用nullptr初始化指针是一种常见的做法,它明确表示该指针不指向任何有效的内存地址。

int* ptr = nullptr;

 

2.函数参数和返回值

在函数参数和返回值中,nullptr用于表示空指针或无结果的情况。

int* findValue(int key) {  // ... 搜索key ...  return nullptr; // 如果没有找到,返回空指针  
}  void processPointer(int* ptr) {  if (ptr == nullptr) {  std::cout << "The pointer is null." << std::endl;  } else {  // 处理ptr指向的数据  }  
}

3.与智能指针一起使用

智能指针如std::unique_ptrstd::shared_ptr可以使用nullptr来初始化或表示空指针。

std::unique_ptr<int> uptr = nullptr;  
std::shared_ptr<int> sptr = nullptr;

4.模板代码中的使用

在模板代码中,nullptr提供了一种类型安全的方式来表示空指针,适用于任何指针类型。

template<typename T>  
void check(T* ptr) {  if (ptr == nullptr) {  std::cout << "Pointer is null." << std::endl;  } else {  std::cout << "Pointer is not null." << std::endl;  }  
}


四、nullptr与NULL的比较

1.类型安全性

  • NULL:可以被隐式转换为任何指针类型,也可以被解释为整数0,存在类型不匹配的风险
  • nullptr:只能被隐式转换为指针类型,提高了类型安全性。

2.重载

  • NULL:由于是一个宏定义,无法用于函数重载。
  • nullptr:可以用于函数重载,特别是在指针和整数类型之间区分。

3.可读性

  • NULL:可能引起歧义,不容易分辨其具体含义。
  • nullptr:明确表示空指针的含义,更易于阅读和理解。

结论

nullptr是C++11引入的一个重要特性,它提供了一种类型安全、明确且易于理解的空指针表示方式。通过使用nullptr,可以显著提高代码的可读性、安全性和可维护性。在C++11及更高版本中,强烈推荐使用nullptr来替代旧式的NULL

 

相关文章:

【C++指南】C++中nullptr的深入解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、nullptr的引入背景 二、nullptr的特点 1.类型安全 2.明确的空指针表示 3.函数重载支…...

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…...

Guava: 探索 Google 的 Java 核心库

Guava 是 Google 开发的一套 Java 核心库&#xff0c;它提供了一系列新的集合类型&#xff08;例如多映射 multimap 和多集合 multiset&#xff09;、不可变集合、图形库以及用于并发、I/O、哈希、原始类型、字符串等的实用工具。Guava 在 Google 的大多数 Java 项目中得到了广…...

Qt-qmake概述

概述 qmake工具为您提供了一个面向项目的系统&#xff0c;用于管理应用程序、库和其他组件的构建过程。这种方法使您能够控制使用的源文件&#xff0c;并允许简洁地描述过程中的每个步骤&#xff0c;通常在单个文件中。qmake将每个项目文件中的信息扩展为一个Makefile&#xf…...

【protobuf】ProtoBuf的学习与使用⸺C++

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;之前我们学习了Linux与windows的protobuf安装&#xff0c;知道protobuf是做序列化操作的应用&#xff0c;今天我们来学习一下protobuf。 目录 ⼀、初识ProtoBuf 步骤1&#xff1a;创建.proto文件 步…...

【iOS】MVC架构模式

文章目录 前言MVC架构模式基本概念通信方式简单应用 总结 前言 “MVC”&#xff0c;即Model&#xff08;模型&#xff09;&#xff0c;View&#xff08;视图&#xff09;&#xff0c;Controller&#xff08;控制器&#xff09;,MVC模式是架构模式的一种。 关于“架构模式”&a…...

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛&#xff1a;第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中&#xff0c;对于指定数据集进行训练&#xff0c;训练结果存在欠拟合…...

Unity-物理系统-刚体加力

一 刚体自带添加力的方法 给刚体加力的目标就是 让其有一个速度 朝向某一个方向移动 1.首先应该获取刚体组件 rigidBody this.GetComponent<Rigidbody>(); 2.添加力 //相对世界坐标 //世界坐标系 Z轴正方向加了一个里 //加力过后 对象是否停止…...

深入探究PR:那些被忽视却超实用的视频剪辑工具

如果想要了解视频剪辑的工具&#xff0c;那一定听说过pr视频剪辑吧。如果你是新手其实我更推荐你从简单的视频剪辑工具入手&#xff0c;这次我就介绍一些简单好操作的视频剪辑工具来入门吧。 1.福晰视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这款工具操…...

Unity-麦克风输入相关

private AudioClip clip; 知识点一 获取设备麦克风信息 string[] strs Microphone.devices; for (int i 0; i < strs.Length; i) { print(strs[i]); } 知识点二 开始录制 参数一&#xff1a;设备名 传空使用默认设备 参数二&#xff1a;超过录…...

NLP--自然语言处理学习-day1

一.初步认识NLP 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学和人工智能&#xff08;AI&#xff09;的一个交叉领域&#xff0c;旨在使计算机能够理解、分析、生成和处理人类语言的能力。它结合了计算语言学、人工智能、机器学习和语言…...

ER论文阅读-Incomplete Multimodality-Diffused Emotion Recognition

基本介绍&#xff1a;NeurIPS, 2024, CCF-A 原文链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2023/file/372cb7805eaccb2b7eed641271a30eec-Paper-Conference.pdf Abstract 人类多模态情感识别&#xff08;MER&#xff09;旨在通过多种异质模态&#x…...

Matlab自学笔记36:日期时间型的概念、分类和创建方法

1.概念 日期时间型&#xff08;Dates and Time&#xff09;数据具有灵活的显示格式和高达毫微秒的精度&#xff0c;并且可以处理时区、夏令时和平闰年等特殊因素 2.日期时间型数据有以下三种表示方式 &#xff08;1&#xff09;Datetime型&#xff0c;表示日期时间点&#x…...

Spring Boot自定义配置项

Spring Boot自定义配置项 配置文件 在application.properties文件添加需要的配置 比如&#xff1a; file.pathD:\\flies\\springboot\\ConfigurationProperties 注解 使用注解ConfigurationProperties将配置项和实体Bean关联起来&#xff0c;实现配置项和实体类字段的关联&…...

【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

文章目录 C类与对象前言读者须知RVO 与 NRVO 的启用条件如何确认优化是否启用&#xff1f; 1. 按值传递与拷贝省略1.1 按值传递的概念1.2 示例代码1.3 按值传递的性能影响1.3.1 完全不优化 1.4 不同编译器下的优化表现1.4.1 Visual Studio 2019普通优化1.4.2 Visual Studio 202…...

什么时候用synchronized,什么时候用Reentrantlock

文章目录 使用 synchronized 的场景使用 ReentrantLock 的场景综合考虑 使用 synchronized 的场景 synchronized 是 Java 内置的同步机制&#xff0c;使用起来比较简单且常用于如下场景&#xff1a; 1、简单的同步逻辑&#xff1a;当你的同步逻辑非常简单&#xff0c;比如只需…...

[ffmpeg]音频格式转换

本文主要梳理 ffmpeg 中的音频格式转换。由于采集的音频数据和编码器支持的音频格式可能不一样&#xff0c;所以经常需要进行格式转换。 API 调用 常用 API struct SwrContext *swr_alloc(void); int swr_init(struct SwrContext *s); struct SwrContext *swr_alloc_set_opt…...

SSRF工具类-SsrfTool

为了帮助开发人员和安全研究人员检测和修复SSRF(Server-Side Request Forgery)漏洞,存在 多种工具。这里我将给出一个简单的工具类示例,这个工具类可以用来检查一个给定的URL是否可 能引发SSRF攻击。请注意,这个工具类主要用于教育目的,并不意味着它可以完全防止所有的…...

python集合运算介绍及示例代码

Python 中的集合&#xff08;set&#xff09;是一种数据类型&#xff0c;用于存储唯一元素的无序集合。集合支持多种运算&#xff0c;如并集、交集、差集和对称差集&#xff0c;方便执行数学上的集合操作。 1. 创建集合 可以使用大括号 {} 或者 set() 函数创建集合&#xff1…...

『功能项目』按钮的打开关闭功能【73】

本章项目成果展示 我们打开上一篇72QFrameWork制作背包界面UGUI的项目&#xff0c; 本章要做的事情是制作打开背包与修改器的打开关闭按钮 首先打开UGUICanvas复制button按钮 重命名为ReviseBtn 修改脚本&#xff1a;UIManager.cs 将修改器UI在UGUICanvas预制体中设置为隐藏 运…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...