首页 > 编程语言 >C++ nullptr/nullptr_t

C++ nullptr/nullptr_t

时间:2022-11-02 18:55:18浏览次数:42  
标签:foo int nullptr C++ 类型 NULL 指针

解释
关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。

引入原因

为什么引入nullptr呢, 不是有NULL这个关键字么?

的确,但是我想问你NULL是什么类型的?

C++98中NULL是个宏定义,明确规定NULL是个整型0值:

1 /* Define NULL pointer value */
2 #ifndef NULL
3     #ifdef __cplusplus
4         #define NULL    0
5     #else  /* __cplusplus */
6         #define NULL    ((void *)0)
7     #endif  /* __cplusplus */
8 #endif  /* NULL */

C中NULL规定为void*指针:

#define  NULL  ((void*)0)

可以看出,C和C++中NULL的规定是不同的,原因在于C++的重载机制。

1 void foo(int) {}
2 void foo(int*) {}
3 
4 foo(0);  // 调用foo(int)而不是foo(int*)
5 foo(NULL);  // 如果NULL是0,则调用foo(int); 如果NULL是0L,则编译错误

C++98规定NULL是一个整型0值,根据不同的编译器实现,可能是0或0L。更尴尬的是,可以拿NULL当合法的整型(int或者long)来使用,所以C++11引入了nullptr表示指针的0值,虽然它不是指针类型,但是它能够转换成任何指针,而且它不能转换成int或者其他类型:

 1 oid foo(char *);
 2 void foo(int);
 3 #include <iostream>
 4 #include <typeinfo>
 5 int main()
 6 {
 7   std::cout << "" << typeid(NULL).name() << std::endl;
 8 }
 9 foo(0); // 调用 foo(int)
10 // foo(NULL); // 该行不能通过编译
11 foo(nullptr); // 调用 foo(char*)

std::nullptr_t

nullptr也有其自身的类型,它的类型为std::nullptr_t。std::nullptr_t本身不是指针类型,但是它可以转换为任何指针类型,这也就是nullptr可以看做任何指针类型的原因。它的定义如下:

typedef decltype(nullptr) nullptr_t;

上面是一个很有趣的类型定义。通常情况是先有类型,然后才有该类型的变量。而上面的定义则是,先有一个某类型的字面值,再由这个字面值定义它的类型。妙哉!

标签:foo,int,nullptr,C++,类型,NULL,指针
From: https://www.cnblogs.com/ybqjymy/p/16852033.html

相关文章

  • C# 调用C++ 动态连接库
    #pragmaonce#defineDLL_API__declspec(dllimport)extern"C"DLL_APIint__stdcallSum(inta,intb);operation.h#include"pch.h"#include"operation.h......
  • C++——变量作用域
    全局变量在全部函数(包括main函数)外面定义的是全局变量;在整个程序生命周期内都是有效的,在定义位置之后的任意函数中都能访问(在定义位置之前的任何函数都不能访问)全局变量......
  • C/C++ Qt 数据库与Chart实现历史数据展示
    在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记......
  • <六>理解C++ new delete
    new和malloc区别?delete和free区别?malloc和free是C语言的库函数new和delete叫做运算符malloc是否开辟成功是通过返回值和空指针比对判断.和new开辟失败会抛出异常.bad_......
  • C++的前置声明
    C++的前置声明C++前置声明,这玩意看起是不是超级简单?我们来看几个问题:模板怎么前置声明typedef怎么前置声明模板的typedef怎么前置声明是不是还是比较头疼的......
  • QML实例化C++的类
    [网页](https://blog.csdn.net/baidu_33850454/article/details/81907857?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166731863916782429784725%2522%252C......
  • 如何解决何避免多个C/C++动态库函数同名冲突
    前言现在的开发节奏越来越快,有大量现成的库来方便我们的开发者来使用,避免重复造轮子,而且有很多有生命力的开源社区。当然在使用过程中,你可能为这样的场景而头痛:你的项目中用......
  • c++ new数组同时初始化
    今天的小目标:先来一个亿,咳咳咳.实现:new一个数组,成员全部用1初始化:int*p=newint[10](1);应该是编译不过的哈!.再来:int*p=newint[10];for(inti=0;......
  • c++从入门到精通——命名空间与作用域
    1C++概述C++两大编程思想面向对象泛型编程1.2移植性和标准ANSI在1998制定出C++第一套标准2c++初识引入头文件#include标准输入输出流使用标准命名空间using......
  • c++从入门到精通——C++对于C语言的增强和拓展
    全局变量检测增强inta;inta=10;C下可以,C++重定义C语言之下,全局变量定义,不会出错。#include<stdio.h>inta;inta=10;intmain(){printf("helloworld!");retu......