nullptr详解

nullptr详解1 引入 nullptr 的原因引入 nullptr 的原因 这个要从 NULL 说起 对于 C 和 C 程序员来说 一定不会对 NULL 感到陌生 但是 C 和 C 中的 NULL 却不等价 NULL 表示指针不指向任何对象 但是问题在于 NULL 不是关键字 而只是一个宏定义 macro 1 1NULL 在 C 中的定义在 C 中 习惯将 NULL 定义为 void 指针值 0 cpp nbsp viewpl

1. 引入nullptr的原因

引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。

1.1 NULL在C中的定义

在C中,习惯将NULL定义为void*指针值0:

[cpp]  view plain   copy

  print ?

  1. #define NULL (void*)0  

但同时,也允许将NULL定义为整常数0

1.2 NULL在C++中的定义

在C++中,NULL却被明确定义为整常数0:

[cpp]  view plain   copy

  print ?

  1. // lmcons.h中定义NULL的源码  
  2. #ifndef NULL  
  3. #ifdef __cplusplus  
  4. #define NULL    0  
  5. #else  
  6. #define NULL    ((void *)0)  
  7. #endif  
  8. #endif  

1.3为什么C++在NULL上选择不完全兼容C?

根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。

[cpp]  view plain   copy

  print ?

  1. // 考虑下面两个重载函数  
  2. void foo(int i);  
  3. void foo(char* p)  
  4.   
  5. foo(NULL); // which is called?  

2. nullptr的应用场景

2.1 编译器

如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。
对于编译器,Visual Studio 2010已经开始支持C++0x中的大部分特性,自然包括nullptr。而VS2010之前的版本,都不支持此关键字。
Codeblocks10.5附带的G++ 4.4.1不支持nullptr,升级为4.6.1后可支持nullptr(需开启-std=c++0x编译选项)

2.2 使用方法

0(NULL)和nullptr可以交换使用,如下示例:

[cpp]  view plain   copy

  print ?

  1. int* p1 = 0;  
  2. int* p2 = nullptr;  
  3.   
  4. if(p1 == 0) {}  
  5. if(p2 == 0) {}  
  6. if(p1 == nullptr) {}  
  7. if(p2 == nullptr) {}  
  8. if(p1 == p2) {}  
  9. if(p2) {}  

不能将nullptr赋值给整形,如下示例:

[cpp]  view plain   copy

  print ?

  1. int n1 = 0;             // ok  
  2. int n2 = nullptr;       // error  
  3.   
  4. if(n1 == nullptr) {}    // error  
  5. if(n2 == nullptr) {}    // error  
  6. if(nullprt) {}          // error  
  7. nullptr = 0             // error  

上面提到的重载问题,使用nullptr时,将调用char*。

[cpp]  view plain   copy

  print ?

  1. void foo(int)   {cout << “int” << endl;}  
  2. void foo(char*) {cout << “pointer” << endl;}  
  3.   
  4. foo(0);       // calls foo(int)  
  5. foo(nullptr); // calls foo(char*)  

3. 模拟nullptr的实现

某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr。

[cpp]  view plain   copy

  print ?

  1. const  
  2. class nullptr_t_t  
  3. {  
  4. public:  
  5.     template<class T>           operator T*() const {
    return 0;}  
  6.     template<class C, class T>  operator T C::*() const { return 0; }  
  7. private:  
  8.     void operator& () const;  
  9. } nullptr_t = {};  
  10. #undef NULL  
  11. #define NULL nullptr_t  













版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203183.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午10:23
下一篇 2026年3月19日 下午10:24


相关推荐

  • Manus与MCP深度解析:原理解析与MCP Client实践教程

    Manus与MCP深度解析:原理解析与MCP Client实践教程

    2026年3月15日
    2
  • 顺风详解Nginx系列—Ngx中的变量

    顺风详解Nginx系列—Ngx中的变量

    2021年6月7日
    220
  • 茂名石化乙烯项目_茂名市天源石化有限公司

    茂名石化乙烯项目_茂名市天源石化有限公司“现在看起来很好,但过程真的不容易。”一直分管茂南石化工业园的区政协副主席、区政府党组成员卢飞说,工业园的建成,得益于茂石化炼油厂卫生防护距离搬迁安置项目,而卫生防护安置搬迁拆迁的工作过程非常艰辛。栽下梧桐树,引来金凤凰。随着园区的加快建设和基础设施的日臻完善,一个个好项目、大项目先后落户园区。园区分管领导抓住优势,紧紧围绕主导产业和产业发展方向,进一步明确招商思路,不断扩充优质产业项目。“其中,总投资18亿元的茂名天源石化丙烯项目落地园区,我们花了很多功夫才争取到这个项目。”卢飞介绍道..

    2022年10月15日
    5
  • CMakeLists.txt 语法介绍与实例演练

    CMakeLists.txt 语法介绍与实例演练一、Cmake简介cmake是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。二、常用命令1.指定cmake的最小版本cmake_minimum_required(VERSION3.4.1)这行命令是可选的,我们可以不写这句话,但在有些情况下,如果CMakeLists.tx…

    2022年6月21日
    54
  • oleDbCommand访问Excel

    oleDbCommand访问ExceloleDbCommand访问Excel:_oleCmdSelect=newOleDbCommand(“SELECT*FROM[Sheet1$A2:A5]”,_oleConn);objValue=_oleCmdSelect.ExecuteScalar();usingSystem;usingSystem.Collections.Generic;usingS…

    2022年5月12日
    46
  • 端口被占用如何解决

    端口被占用如何解决经常 我们在启动应用的时候发现系统需要的端口被占用 如何知道谁占有了该端口 很多人都比较头疼 下面就介绍一种非常简单的方法 希望对大家有用假如我们需要确定谁占用了我们的 8080 端口 nbsp 1 可通过 cmd netstat ano nbsp nbsp 指令查看所有的端口占用情况 C Users Administrato ano 活动连接 nbsp 协议 nbsp 本地地址

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号