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




  

相关话题

  Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 
  如果加班是自愿的,你们会为了钱加班吗? 
  现在 c++中 long 整数类型还有使用的意义吗? 
  C++代码可以魔法到什么程度? 
  C语言中,为什么指向指针的指针的类型是int **?类型的话直接int*不就行了? 
  「C++ 早就过时了,大部分写工程不用 C++,学习这个语言只是为了竞赛」的观点是否正确? 
  有哪些好用的 C++ IDE? 
  C++在构造函数内new对象的最佳实践是什么? 
  请问指针的这些概念如何理解? 
  如何才能写出没有bug的程序? 

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





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