百科问答小站 logo
百科问答小站 font logo



C++ 11为什么引入nullptr? 第1页

  

user avatar   pansz 网友的相关建议: 
      

这就要涉及到C++作者当年的一个设计了:

C++作者当年为了搞C++模版(泛型)设计,需要制定出一些对所有类型可以适配的操作。

而他当年的定义是:0是一个特殊的,无类型常量。他可以被赋值给所有类型的变量,在所有类型中均表示空值。因而在模版函数内,对于任何 class T(或者说 typename T)类型的变量均可以确保能合法赋值为 0,这样就赋予了模板类变量一个可用的赋值或者初值。

所以从 C++ 开始, 0 赋值给指针就一定表示空值。0 赋值给布尔量就一定表示为 假。因为 0 在 C++ 语言中被定义为必须对所有类型均可用的值。

NULL是C语言的一个宏,这个宏在C++中是不存在的,只是为了兼容C代码而设计。C++作者鼓励使用 0 替代NULL,因此C++中的 NULL 被直接宏定义为 0。而NULL在C语言中是指针类型,在C++中是个无类型值,两者定义并不相同。

然而这就意味着,在C++中空指针实际上是0,而0是无类型值,他无法进行类型推导,在进行函数调用,匹配重载函数时存在异议。很多编译器更是直接把它当作 int 处理。

C++11引入nullptr,自然是引入了一个拥有类型的空指针。他支持更好的类型推导,与0那种无类型值就有了不同。自然,这就又回到了 C 语言的老路上来了。


所以回答题主: NULL 这个宏是 C 语言专用的,C++ 只是为了对 C 的兼容性而保留了 NULL 宏,但你不应当在 C++ 编程中使用它。

在 C++11 以前你应当使用 0 替代 NULL, 在 C++11 以后你应当使用 nullptr 替代 NULL。


user avatar   enzojz 网友的相关建议: 
      

NULL没有类型检查




  

相关话题

  如何看待七牛 CEO 许式伟开源的 Cerl? 
  为什么 C++ std::map::operator[] 不提供 const 版本? 
  求十亿内所有质数的和,怎么做最快? 
  2019 年了,Rust 到底比 C++ 强在哪里? 
  C++里 const int* 与 int const* 有什么区别? 
  C++ 父类对象赋值给子类对象是未定义行为么? 
  为什么世界上大多数地方的人习惯用逗号表示小数点,而C++却用圆点表示小数点,而不是按照大多数地方习惯? 
  for 循环为什么不支持小数? 
  C++里 const int* 与 int const* 有什么区别? 
  怎么使C++用最复杂的方法打hello world? 

前一个讨论
怎么样用c语言求1000的阶乘?
下一个讨论
随着微软收购动视暴雪,使命召唤 COD 系列今后会变成索尼 PlayStation 独不占吗?





© 2024-05-22 - tinynew.org. All Rights Reserved.
© 2024-05-22 - tinynew.org. 保留所有权利