百科问答小站 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没有类型检查




  

相关话题

  C++在构造函数内new对象的最佳实践是什么? 
  现在 c++中 long 整数类型还有使用的意义吗? 
  C++中 std::string 应该声明在循环内部还是外部? 
  有人对 C++ 基本数据类型采用 int x{5}; 的方式进行初始化吗? 
  C/C++有什么库可以完成命令行参数解析? 
  C++如何返回未知类型的空引用? 
  怎么看待 Linus 和 Richard Stallman 对 C++ 的态度? 
  c语言有哪些图形库(非c++)? 
  左移40位为什么不能写成1<<40ll? 
  何时使用 Protected 继承? 

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





© 2025-04-25 - tinynew.org. All Rights Reserved.
© 2025-04-25 - tinynew.org. 保留所有权利