为什么应该使用nullptr

转载地址:http://www.stroustrup.com/bs_faq2.html#null

为什么应该使用nullptr呢,以下是c++之父的解释:


1down vote


Here is Bjarne Stroustrup‘s wordings,

In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That‘s less common these days.

If you have to name the null pointer, call it nullptr; that‘s what it‘s called in C++11. Then, "nullptr" will be a keyword.

即:

在C++中,NULL就是0(#define NULL 0)(在C中,NULL被定义为0或void*),有时人们认为NULL和整数0是不同的,或者NULL不是个整数。

这就可能给程序带来二义性。比如以下重载函数:

void f(int)  ----------->f(0)

void f(const char *)----------->f(NULL) == f(0)

当使用f(NULL)时,你认为程序应该调用f(const char *),但现实情况中,f(NULL)调用的是f(int),这样就会出现二义性了。正确的调用方法应该是:f(nullptr);

而nullptr是一个指针类型( std::nullptr_t ),当你想命名一个空指针时,就用nullptr。

时间: 2024-12-17 22:00:49

为什么应该使用nullptr的相关文章

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类型,详情看上一篇bl

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新特性之三——nullptr

1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起.对于C和C++程序员来说,一定不会对NULL感到陌生.但是C和C++中的NULL却不等价.NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro). 1.1 NULL在C中的定义 在C中,习惯将NULL定义为void*指针值0: #define NULL (void*)0 但同时,也允许将NULL定义为整常数0. 1.2 NULL在C++中的定义 在C++中,NULL却被明确定

C++11中的指针空值nullptr

时间:2014.05.07 地点:基地 ----------------------------------------------------------------------------- 一.为什么要有指针空值nullptr 在良好的编码习惯中,声明一个指针并对其进行初始化非常重要,未初始化的悬挂指针常导致一些难以调试的错误.往常,我们常这样初始化指针变量: int* my_ptr1=0; int* my_ptr2=NULL; 但我们知道,NULL其实是一个宏定义,字面常量为0,即上述两

nullptr

以前都是用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题.关键字nullptr是std::nullptr_t类型的值,用来指代空指针.nullptr和任何指针类型以及类成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型(取值为false).但是不存在到整形的隐式类型转换. 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int *p1 = NULL; 7 int *

【转载】C/C++杂记:NULL与0的区别、nullptr的来历

原文:C/C++杂记:NULL与0的区别.nullptr的来历 某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. 前者可能觉得:NULL作为空指针常量,名字很形象,可读性较强. 后者可能觉得:NULL并不是C/C++语言的关键字,而是一个在标准库头文件<stddef.h>中定义的宏,因此要使用NULL,可能需要直接或简介地包含<stddef.

const对象,NULL和nullptr,C++中创建对象数组

 1.定义成了const之后的类 #include <iostream> class area { public: int x; int y; mutable int z; //不受const约束的类成员 area() :x(10), y(10), z(2) { } void printxy()const //不可以访问类中局部变量 { z = z + 1; std::cout << x << " " << y << &q

NULL和nullptr的区别

指定 std::nullptr_t 类型的 null 指针常量,该类型可转换为任何原始指针类型.尽管您可以使用关键字 nullptr 而不包含任何标头,但如果您的代码使用类型 std::nullptr_t,则您必须通过包含标头 <cstddef> 来定义该类型.请避免将 NULL 或零 (0) 用作 null 指针常量:nullptr 不仅不易被误用,并且在大多数情况下使用效果更好.例如,给定 func(std::pair<const char *, double>),那么调用 f

(转)null和NULL和nullptr和””区别

突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的.NULL代表空地址,null只是一个符号.便来深究,看了很多资料,总结如下: 其实null和NULL都是字符串(没啥区别,欢迎高手纠错!),具体看它们宏定义被定义成为什么值. 在VS中NULL被定义为0,因为习惯上把宏定义的所有字符都大写,当把NULL它赋值给指针时意思为空,当然你也可以把null定义为0了,都一样. 它们都没定义时都只能叫符号了,定义后就有另外的意思了,你把0直接赋值给指针也行,只要

C++11新标准:nullptr关键字

一.nullptr的意义 1.NULL在C中的定义 #define NULL (void*)0 2.NULL在C++中的定义 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 3.为什么C++和C中NULL定义不一样呢? void foo(int a) { cout<<"This is int"<<endl; } void foo