【C++入门】新增nullptr关键字详解

2023-11-18

1、C和C++中NULL的区别

#ifdef _cplusplus // 定义这个符号就表示当前是C++环境
#define NULL 0 // 在C++中NULL就是0
#else
#define NULL (void *)0 // 在C中NULL是强制类型转换为void *的0
#endif

(1)虽然NULL在C/C++的本质都是二进制0,但是在C中NULL是指针类型,在C++中就是纯粹的数字0;
(2)在C/C++中NULL本意是用来当做空指针,但是在C++中NULL却是纯数字0,这就有问题了;
(3)注意NULL不是关键字,而是宏定义;
(4)C++不允许void *隐式转为int *等类型;
参考博客:《c语言中NULL到底是什么?》

2、NULL在C++中带来的歧义

2.1、示例代码

#include <iostream>
using namespace std;

//传参是int型变量
void func(int x) {
    cout<<"void func(int x)"<<endl;
}
 
//传参是指针变量
void func(char *y) {
    cout<<"void func(int *y)"<<endl;
}
 
int main()
{
    func(NULL);
    return 0;
}

2.2、报错原因分析

[root#]$ g++ test.cpp 
test.cpp: In function ‘int main():
test.cpp:14: error: call of overloaded ‘func(NULL)’ is ambiguous
test.cpp:4: note: candidates are: void func(int)
test.cpp:8: note:                 void func(char*)

(1)报错原因是函数重载时调用不明确;
(2)NULL在C++中是纯数字0,应该调用void func(int x)函数;但是NULL在用法上是用来表示空指针,调用void func(char *y)也说的过去。所以在两种解释都可以的情况下,产生冲突,编译器直接报错;

3、C++引入nullptr关键字

const class nullptr_t{
public:
	template<class T> inline operator T*()const {return 0;}
	template<class C, class T> inline operator T C::*() const {return 0;}
private:
	void operator&() const;
} nullptr={};

(1)nullptr关键字是c++11引入的,注意nullptr是关键字而NULL是宏定义;
(2)nullptr传参,表示真正的空指针,作用就是C语言里的NULL,在C++中空指针用nullptr,目的就是解决上面NULL带来的歧义;
(3)在编译程序时,需要指定C++的版本不低于c++11,比如:g++ -std=c++11 test.cpp;

4、nullptr的示例代码

#include <iostream>
using namespace std;

//传参是int型变量
void func(int x) {
    cout<<"void func(int x)"<<endl;
}
 
//传参是指针变量
void func(char *y) {
    cout<<"void func(int *y)"<<endl;
}
 
int main()
{
    func(0);
	func(nullptr);
    return 0;
}

5、输出结果

void func(int x)
void func(int *y)

6、推荐

我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++入门】新增nullptr关键字详解 的相关文章

随机推荐

  • 基于Matlab应用DBSCAN

    基于Matlab应用DBSCAN Density Based Spatial Clustering of Applications with Noise 具有噪声的基于密度的聚类方法 一 算法原理 Matlab中的统计与机器学习工具箱 Th
  • SuperSocket实战手把手教程:一个完整的SocketServer项目

    SuperSocket系列教程 1 SuperSocket基础 一 基本概念 2 SuperSocket实战手把手教程 一个完整的SocketServer项目 目录 一 项目场景 1 Visual Studio新建项目 2 自定义自己服务器
  • pre loader简单分析

    ZZ from http blog csdn net ly601579033 article details 48318239 大致的流程图如下 上电后RESET ARM核开始执行Boot ROM 具体操作有 代码固化在ROM中 1 初始化
  • 【软件硬件】相机标定(Camera calibration)原理、步骤

    转载来源 https blog csdn net lql0716 article details 71973318 locationNum 8 fps 1 在图像测量过程以及机器视觉应用中 为确定空间物体表面某点的三维几何位置与其在图像中对
  • 使用OpenGL实现的光线追踪器示例

    使用OpenGL实现的光线追踪器示例 光线追踪是一种计算机图形学中常用的方法 它可以模拟光线在三维空间中的传播和反射 在本文中 我们将介绍如何使用OpenGL实现一个简单的光线追踪器 在本例中 我们将创建一个场景 其中包含一个球体和一个平面
  • flutter a .dex file cannot exceed 64K

    第一步 添加multidex 第二部 添加multiDexEnabled 构建运行完事
  • 获取下拉菜单值

    function getSelectVal ele var selectedIndex ele selectedIndex var value ele options selectedIndex value return value
  • oracle生成编号(首字母+YYYY-DD-MM+4位序号)自动增长,4位序号达到9999,在从1001开始。

    今天写业务的时候遇见需要系统生成13位的编号 规则编号按一个大写字母 YYYY MM DD 4位序号组成 数据库用的oracle 所以就打算用序列实现 下面是实现方式 1 先创建序列 create sequence contact seq
  • vue2.x 插件的开发

    前言 第一次好好学习插件的开发 有什么不正确的地方麻烦指正 另外写这篇文章 纯粹是当作自己的学习笔记 插件 插件通常用来为 Vue 添加全局功能 插件的功能范围没有严格的限制 一般有下面几种 添加全局方法或者 property 如 vue
  • 如何查看和修改操作系统字符集

    在Windows平台下查看和修改字符集 一 查看字符集 chcp 二 修改字符集为936 chcp 936 简体中文 可以得到操作系统的代码页信息 你可以从控制面板的语言选项中 可以查看代码页对应的详细的字符集信息 linux下查看和修改字
  • JavaScript 手写深拷贝

    深拷贝 深拷贝就是要拷贝的对象内的所有引用类型的属性进行完整的拷贝 也就是说拷贝出来的对象和原对象之间没有任何数据是共享的 所有的东西都是自己独占的一份 三步实现深拷贝 第一步 判断入参是值类型还是引用类型 值类型直接返回 if typeo
  • 数字图像处理课程设计-疲劳检测系统

    文章目录 数字图像处理课程设计 疲劳检测系统 前言 一 课程设计任务 二 设计框图 三 准备工作 四 任务流程 视频预处理 4 2图片分割 五 结果 六 项目总结 数字图像处理课程设计 疲劳检测系统 前言 此系统基于MATLAB设计 核心思
  • 系统稳定性设计原则:简单、冗余、标准化、健壮

    作者介绍 淇公 蚂蚁金服技术专家 热爱java和一些函数式语言 长期关注系统稳定性领域 因为base在分公司 需要经常去总部出差 所以搭乘飞机成了家常便饭 很多时候坐在飞机上会不由的感叹 设计制造这样精密复杂的机器的那帮人真的是了不起 他们
  • 如何获取Windows软件安装信息

    猜你感兴趣 使用Pyqt5玩转ChatGpt 内网文件共享服务 快速搭建私有pip镜像源 python设计模式 创建型模式 docker搭建私有git服务器 项目备份和迁移 redis持久化方案 说明 windows注册表中有两支子健存储有
  • Swagger3 注解使用(Open API 3.0)

    文章目录 前言 一 swagger 3 的使用 Swagger SpringFox 3 0 相关特性 SpringDoc 二 从 spring fox 迁移到 springdoc 三 使用 swagger3 注解代替 swagger2 的
  • 【算法/剑指Offer】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    题目描述 从上到下按层打印二叉树 同一层结点从左至右输出 每一层输出一行 struct TreeNode int val struct TreeNode left struct TreeNode right TreeNode int x v
  • (Oracle基础篇) Select检索数据

    Select语句语法 Select语句是日常使用最多的语句 它以select开头 其中最重要的部分就是Select和From关键字 这两项是查询当中必须的部分 其他子句可以根据实际的需求进行变动 获取指定字段数据代码 查询指定字段数据实例代
  • 如何在Jupyter Notebook中使用Tensorflow

    下边是原文链接 中文翻译如下 http stackoverflow com questions 35771285 using tensorflow through jupyter python 3 解决该问题主要参考Using a virt
  • 7个学习UI、UX设计一定要经历的步骤

    我们不是一些有才华的设计师 我们天生就有艺术天赋 后天我们学会了设计技巧 设计的根本目的是解决问题 设计是不断发现和解决问题 有许多设计领域 UI UX 产品设计师 平面设计师 交互设计师 信息架构师等 所以要找出你最感兴趣的设计专业 现在
  • 【C++入门】新增nullptr关键字详解

    1 C和C 中NULL的区别 ifdef cplusplus 定义这个符号就表示当前是C 环境 define NULL 0 在C 中NULL就是0 else define NULL void 0 在C中NULL是强制类型转换为void 的0