码迷,mamicode.com
首页 > 其他好文 > 详细

第二十五章 nullptr

时间:2014-12-22 17:52:47      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

早在 1972 年,C语言诞生的初期,常数 0 带有常数及空指针的双重身分。 C 使用 preprocessor macro NULL 表示空指针, 让 NULL 及 0 分别代表空指针及常数 0。 NULL 可被定义为((void*)0) 或是 0

C++ 并不采用 C 的规则,不允许将 void* 隐式转换为其他类型的指针。 为了使代码 char* c = NULL; 能通过编译,NULL 只能定义为 0。 这样的决定使得函数重载无法区分代码的语义:

1 void foo(char *);
2 void foo(int);

C++ 建议 NULL 应当定义为 0,所以foo(NULL); 将会调用 foo(int), 这并不是程序员想要的行为,也违反了代码的直观性。0 的歧义在此处造成困扰。

C++11 引入了新的关键字来代表空指针常数:nullptr,将空指针和整数 0 的概念拆开。 nullptr 的类型为nullptr_t,能隐式转换为任何指针或是成员指针的类型,也能和它们进行相等或不等的比较。 而nullptr不能隐式转换为整数,也不能和整数做比较。

为了向下兼容,0 仍可代表空指针常数。

1 char* pc = nullptr;     // OK
2 int * pi = nullptr;     // OK
3 int    i = nullptr;     // error
4  
5 foo(pc);           // 呼叫 foo(char *)

 总结:nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0,而0又是int型

 1 void F(int a){
 2     cout<<a<<endl;
 3 }
 4 
 5 void F(int *p){
 6     assert(p != NULL);
 7 
 8     cout<< p <<endl;
 9 }
10 
11 int main(){
12 
13     int *p = nullptr;
14     int *q = NULL;
15     bool equal = ( p == q ); // equal的值为true,说明p和q都是空指针
16     int a = nullptr; // 编译失败,nullptr不能转型为int
17     F(0); // 在C++98中编译失败,有二义性;在C++11中调用F(int)
18     F(nullptr);
19 
20     return 0;
21 }

 

第二十五章 nullptr

标签:

原文地址:http://www.cnblogs.com/zenseven/p/4178583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!