C++11新特性之nullptr(初始化空指针)

1.为什么引入nullptr?

        在实际开发中,避免产生“野指针”最有效的方法就是在定义指针时完成初始化操作,即定义为空指针。

野指针是指没有明确指向的指针。野指针往往指向的是那些不可用的内存区域,这意味着像操作普通指针那样使用野指针(如&p),可能会导致程序异常。

        C++98/03标准中,将一个指针初始化为空指针方式有两种:

        (1)指针初始化为0这个内存空间。

int *p = 0;

        明确了指针的指向,并且大部分操作系统不允许用户对地址为0的内存空间执行操作。

        (2)指针初始化为NULL。(常用)

int *p = NULL

        我们一般采用这种方式初始化。NULL是C++事先定义好的一个宏,其值为字面量0(#define NULL 0)。

        使用第二种方式初始化能满足大部分场景需要,但在个别情况下会导致程序运行不符合预期。例如:

#include <iostream>
using namespace std;
void isnull(void *c){cout << "void*c" << endl;
}
void isnull(int n){cout << "int n" << endl;
}
int main() {isnull(0);isnull(NULL);return 0;
}

        程序执行结果为:

        int n 

        int n

        对于 isnull(0) 来说,它调用的是isnull(int n) 函数;而对于 isnull(NULL),我们期望它调用的是 isnull(void*c) 函数,但观察程序的执行结果不难看出,与我们的预期不符合。

        若想正确调用isnull(void *c)函数,需要在调用中进行强制类型转换,如下所示:

isnull((void*) NULL );

        只有这样才能成功调用到预期的函数。(可以编译观察结果)。

        C++98标准使用期间,NULL得到了广泛应用,出于兼容性考虑,C++11对NULL没做任何改变,但为了解决这个问题,C++11标准引入了一个新的关键字——nullptr。(本文的主角)       

2.nullptr介绍

        nullptr是nullptr_t类型(C++11新增加的数据类型,称为“指针空值类型”)的右值常量,专门用于初始化空指针。nullptr就是该类型的一个实例对象(帮你定义好了,可以直接用),我们也可以自己定义出完全相同的nullptr实例对象。

3.nullptr用法

        初始化指针。

        特点:可以被隐式转换成任意的指针类型,但不能转换为整数类型(解决了上面函数的调用问题)。

int * a1 = nullptr;
char * a2 = nullptr;
double * a3 = nullptr;

4.与NULL的区别

        (1)nullptr具有明确的类型nullptr_t。

        (2)nullptr可以隐式转换成任意类型的指针,但不能转化为整数类型。而NULL本质上还是一个整数(0)。

 5.总结

        nullptr主要用于指针初始化和指针比较(判断指针是否为空)。具有安全和语义清晰的优点。但在使用中,要注意版本和兼容性,在新的代码中建议优先使用nullptr使代码更加健壮。

        

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

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

相关文章

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的智能学习平台管理系(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的智能学习平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、…

Odoo免费开源ERP最佳业务实践:主生产计划概论

Odoo主生产计划(Master Production Schedule&#xff0c; MPS)是确定每一个具体产品在每一个具体时间段的生产计划。 文&#xff5c;开源智造Odoo亚太金牌服务 老杨 概述 Odoo是全球排名第一的免费开源ERP系统&#xff0c;以其强大的功能和模块化设计著称&#xff0c;适用于各…

深入浅出DeepSeek LLM 以长远主义拓展开源语言模型

深入浅出地讲解DeepSeek LLM 以长远主义拓展开源语言模型 &#x1f31f; 1. 什么是 DeepSeek LLM&#xff1f; 大家想象一下&#xff0c;你在游戏里要打造一个超级英雄角色&#xff0c;选择最强的装备、技能点和升级策略。那么&#xff0c;DeepSeek LLM 就是 AI 界的“超级英雄…

C# ASP.NET程序与 Web services 编程介绍

.NET学习资料 .NET学习资料 .NET学习资料 在当今的软件开发领域&#xff0c;C# 和ASP.NET是构建强大而灵活的 Web 应用程序的重要工具&#xff0c;而 Web services 则为不同应用程序之间的通信和交互提供了便利。下面将详细介绍 C# ASP.NET程序与 Web services 编程。 一、C…

C# 综合运用介绍

.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种由微软开发的面向对象编程语言&#xff0c;在软件开发领域占据着重要地位。凭借其简洁、类型安全以及与.NET 框架的紧密结合等特性&#xff0c;C# 被广泛应用于多个领域。下面将详细介绍 C# 的综合运用。 一、C# 语言特性…

TOTP实现Google Authenticator认证工具获取6位验证码

登录遇到Google认证怎么办? TOTP是什么?(Google Authenticator) TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,主要用于双因素身份验证。其核心原理是通过共享密钥和时间同步生成动态密码,具体步骤如下: 共享密钥:服务端与客户端预先共享一个…

@RequestBody与@ResponseBody:Spring数据处理的“翻译官”

在Spring中&#xff0c;RequestBody和ResponseBody注解就像是数据交换的“翻译官”。 1. RequestBody注解&#xff1a;它的作用就像是把客户端发来的“外语”翻译成Java对象。当我们发送一个HTTP请求到服务器时&#xff0c;请求体里通常包含了一些数据&#xff0c;这些数据可能…

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

一、引言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志&#xff1a; 网络爬虫学习&#xff1a;应用selenium从搜*狐搜…

【学习总结|DAY036】Vue工程化+ElementPlus

引言 在前端开发领域&#xff0c;Vue 作为一款流行的 JavaScript 框架&#xff0c;结合 ElementPlus 组件库&#xff0c;为开发者提供了强大的构建用户界面的能力。本文将结合学习内容&#xff0c;详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用&#xff0c;助力开发者快…

LM Studio 部署本地大语言模型

一、下载安装 1.搜索&#xff1a;lm studio LM Studio - Discover, download, and run local LLMs 2.下载 3.安装 4.更改成中文 二、下载模型(软件内下载) 1.选择使用代理&#xff0c;否则无法下载 2.更改模型下载目录 默认下载位置 C:\Users\用户名\.lmstudio\models 3.搜…

处理Spring MVC 中的跨域问题

在 Spring MVC 中&#xff0c;跨域问题指的是浏览器从一个域名的网页去请求另一个域名的资源时&#xff0c;由于浏览器的同源策略而受到限制。同源策略要求浏览器在访问资源时&#xff0c;协议、域名和端口都必须相同&#xff0c;否则会产生跨域问题。以下是几种常见的处理 Spr…

基于知乎平台的“开源AI智能名片2 + 1链动模式S2B2C商城小程序”引流策略研究

摘要&#xff1a;本文聚焦于如何借助知乎平台的高权重及优质用户特性&#xff0c;对“开源AI智能名片2 1链动模式S2B2C商城小程序”进行有效引流。通过深入分析知乎平台的用户特点、引流规则&#xff0c;并结合具体的引流方法&#xff0c;旨在为相关项目在知乎平台实现高效用户…

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本&#xff0c;可以通过定时任务自动处理表空间不足的问题&#xff1b;但是之前那个脚本没有涵盖CDB模式下的PDB&#xff0c;这里将脚本做了一下更新&#xff0c;可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…

在 Navicat 17 中扩展 PostgreSQL 数据类型 | 创建自定义域

定义域 以适当的格式存储数据可以确保数据完整性&#xff0c;防止错误&#xff0c;优化性能&#xff0c;并通过实施验证规则和支持高效数据管理来维护系统间的一致性。基于这些原因&#xff0c;顶级关系数据库&#xff08;如PostgreSQL&#xff09;提供了多种数据类型。此外&a…

CentOS 环境下 Docker、Jenkins、GitLab 和 Kubernetes 安装与配置

以下是针对 CentOS 系统的安装和配置步骤&#xff0c;涵盖 Docker、Jenkins、GitLab 和 Kubernetes (K8s)&#xff0c;以及 CI/CD 流程的配置。通过这些步骤&#xff0c;可以搭建一个企业级 DevOps 环境。 1. 安装和配置 Docker 1.1 安装 Docker&#xff08;CentOS 示例&…

细说机器学习数学优化之梯度下降

系列文章目录 第一章&#xff1a;Python 机器学习数学优化之梯度下降 目录 系列文章目录 前言 一、基本原理&#xff1a; 二、使用步骤: 三、梯度下降类型&#xff1a; 四、应用场景&#xff1a; 总结 前言 梯度下降&#xff08;Gradient Descent&#xff09;是人工…

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…