首页 > 代码库 > 第二十五章 nullptr
第二十五章 nullptr
早在 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; // OK2 int * pi = nullptr; // OK3 int i = nullptr; // error4 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不能转型为int17 F(0); // 在C++98中编译失败,有二义性;在C++11中调用F(int)18 F(nullptr);19 20 return 0;21 }
第二十五章 nullptr
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。