百科问答小站 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语言中,write(1,buf,N)与write(0,buf,N)在底层存在什么样的区别? 
  求助:C++中应该怎样理解实参和形参的区别? 
  为什么说C++的main函数最后不写 return 0; 是不好的习惯? 
  vector 使用 emplace_back 会调用复制构造函数吗? 
  C++的优势有哪些? 
  C++的CRTP所带来的静态多态功能具体有什么用? 
  我怎样成为@vczh一样的大神? 
  为什么大多数人用C++时都要用&&,||和!来表示与或非,而不是用and or not? 
  你能否在不传递指针的情况下通过函数交换两个变量的值,如果可以请说明方法,如果不行请分析原因。?计算机? 
  非计算机专业自学C++,有什么书籍推荐? ? 

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





© 2025-05-06 - tinynew.org. All Rights Reserved.
© 2025-05-06 - tinynew.org. 保留所有权利