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




  

相关话题

  CMake如何优雅地读取txt内容并载入到C++二进制中? 
  C++中 unsigned t = 2147483647 + 1 + 1; 是 UB 还是 ID? 
  C语言中,write(1,buf,N)与write(0,buf,N)在底层存在什么样的区别? 
  C++原子变量数组能用memset置空吗? 
  c++指针有啥优越性啊,什么情况下要用指针呐,大一初学有点不懂。? 
  非计算机专业自学C++,有什么书籍推荐? ? 
  a += a *= a; 为什么在C++和Java算出了不同结果? 
  如何正确通过 C++ Primer 学习 C++? 
  vector 使用 emplace_back 会调用复制构造函数吗? 
  你有过哪些被 C++ 摧残的经历? 

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





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利