nullptr和NULL

nullptr是c++11中的关键字,表示空指针

要区分nullptr和NULL,首先要明白NULL的含义:

NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0

//C语言中NULL定义
#define NULL (void*)0                //c语言中NULL为void类型的指针,但允许将NULL定义为0

//c++中NULL的定义
#ifndef NULL
#ifdef _cpluscplus                       //用于判定是c++类型还是c类型,详情看上一篇blog
#define NULL 0                         //c++中将NULL定义为整数0
#else
#define NULL ((void*)0)             //c语言中NULL为void类型的指针
#endif
#endif

所以在c++中int *p=NULL; 实际表示将指针P的值赋为0,而c++中当一个指针的值为0时,认为指针为空指针

然后理解nullptr:

nullptr是一个字面值常量,类型为std::nullptr_t,空指针常数可以转换为任意类型的指针类型。

在c++中(void *)不能转化为任意类型的指针,即 int *p=(void*)是错误的,但int *p=nullptr是正确的,原因

对于函数重载:若c++中 (void *)支持任意类型转换,函数重载时将出现问题下列代码中fun(NULL)将不能判断调用哪个函数

void fun(int i){cout<<"1";};
void fun(char *p){cout<<"2";};
int main()
{
fun(NULL);  //输出1,c++中NULL为整数0
fun(nullptr);//输出2,nullptr 为空指针常量。是指针类型
}
时间: 2024-07-31 13:47:50

nullptr和NULL的相关文章

优先选择nullptr而不是0和NULL

我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针. 实际上来说,对于NULL也是一样.关于NULL还有一些不确定因素,因为其实现允许给NULL一个整型而不必是int(比如说long).这并不常见,但是也无关紧要,因为这里的问题并不是NULL的确切类型是什么,而是0和NULL都不是指针类型. 在C++98中,主要的启示就是对指针和整型分别进行重载可

C++11 之 nullptr

C++11 中, nullptr 是空指针,可用来给 (指向任意对象类型的) 指针进行赋值 广义整型 (integral types) = char, short, int, long, long longnd and their unsigned counterparts, and bool, wchar_t, char16_t, and char32_ 1  调用重载函数 0 在 C++ 中,被首先视为 int 型.NULL 在 C++ 中,首先视为广义整型 (integral types)

c++ 11 key note

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

充分利用C++11特性,Cocos2dx对话框的实现

一般一个对话框会分为模态对话框和非模态对话框两种,模态对话框是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应.如单击[确定]或[取消]按钮等将该对话框关闭.非模态(Modeless)对话框,又叫做无模式对话框,当用户打开非模态对话框时,依然可以操作其他窗口.例如,Windows提供的记事本程序中的[查找]对话框.(抄自百度百科) 目前我需要的一个对话框功能列表如下: 1.需要显示一段提示信息,可能是一段对话可能是一个问题. 2.必须有确认按钮,可能会有取消按钮 3.确认

Vulkan Tutorial 04 理解Validation layers

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 What are validation layers? Vulkan API的设计核心是尽量最小化驱动程序的额外开销,所谓额外开销更多的是指向渲染以外的运算.其中一个具体的表现就是默认条件下,Vulkan API的错误检查的支持非常有限.即使遍历不正确的值或者将需要的参数传递为空指针,也不会有明确的处理逻辑,并且直接导致崩溃或者未定义的异常行为.之所以这样,是因为Vulkan要求每

cocos2dx3.6 实现带光标的输入框

多的不说,我这个学渣,我写的代码比较搓!忍耐下吧! CursorTextField.h #ifndef _CursorTextField_H_ #define _CursorTextField_H_ #include "cocos2d.h" USING_NS_CC; class CursorTextField : public TextFieldTTF, public TextFieldDelegate , public IMEDelegate { private: // 点击开始位置

Google&#39;s C++ coding style

v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件        #define用法        前向声明        内联函数        -inl.h文件        函数参数顺序        include的命名和顺序    作用域        命名空间            未命名空间            命名空间       

C++11的一些特性

1.断言是将一个需要为真的表达式放在语句中,在debug模式下检查一些逻辑错误的参数,C++中使用assert需要使用<assert.h>或者<cassert>头文件.有函数定义如下: void fun(int a[],int n) { assert(n>0); //dosomething; } 这样就可以检查n<=0的情况,如果遇到这种情况,程序会调用abort()函数而终止. C++11提供了static_assert断言,它的函数原型接受两个参数,一个是断言表达式

Ten C++11 Features Every C++ Developer Should Use

原版:http://www.codeproject.com/Articles/570638/Ten-Cplusplus-Features-Every-Cplusplus-Developer 译版:http://blogs.ejb.cc/archives/7190/top-10-new-features-you-should-know-about-c-11 This article discusses a series of features new to C++11 that all devel