为什么要用nullptr

在我们C++的代码的使用时我常用NULL作为空指针的判断,或者指针的赋空,如下代码:

#include "pch.h"
#include <iostream>

void test(char *p)
{
    printf("this is p");
}

int main()
{
    test(NULL);
}

代码输出:

this is p

但是,在C++中,NULL的定义是 0

  • ps:在C语言中,NULL 的定义是 (void*)空指针
#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

因为在C++中,(void*)不能隐式的转换为其他指针类型。所以使用int类型的0转换为各种类型的空指针。

在这种情况下我们会出现一些二义性:

#include "pch.h"
#include <iostream>

void test(int n)
{
    printf("this is int");
}

void test(char *p)
{
    printf("this is p");
}

int main()
{
    test(NULL);
}

运行结果:

this is int

我认为NULL是空指针的意思,但是调用却不是。

nullptr是C++11用来解决这个问题引入的,专门用于处理空指针的情况。
如下:

#include "pch.h"
#include <iostream>

void test(int n)
{
    printf("this is int");
}

void test(char *p)
{
    printf("this is p");
}

int main()
{
    test(NULL);
    printf("\n");
    test(nullptr);
}

运行输出:

this is int
this is p
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,457评论 0 49
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,533评论 1 51
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,877评论 0 38
  • 晚上舅舅给我发消息,大概说了一下今天家里一大家子人回去祭祖的事情,一切都很顺利。接着又提到我爸妈年龄大了,我该好好...
    莲悦阅读 321评论 2 3