现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚
Posted CodeBowl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚相关的知识,希望对你有一定的参考价值。
在讲这个问题之前,我想先说下本文的风格,这也是我写作的风格,通常我不会像教科书一般上来就直说概念和道理,我喜欢用已知,大家可以理解的问题去引入一个知识,这是我自己的学习方法,也希望介绍给大家。
例如本文,很多人可能不知道nullptr,也不知道为什么要引入它,但是大家都知道NULL,通过NULL引入,就往往容易接受的多。
本文你可以得到什么
你可以知道一个极其好用没用难度的新特性 nullptr
你可以知道为什么C++要用nullptr代替NULL
你可以在以后的编程中使用更加风骚的nullptr
(本文面向小白,大佬勿喷)
问题叙述
之前,我们对指针进行初始化的时候往往使用NULL,在当时看来那并没有问题!
void* ptr =NULL;
但是在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东 西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义 为 0。
那么这样会出现什么问题呢?
没有了 void * 隐式转换的 C++ 只好将 NULL 定义为 0。而这依然会产生新的问题,将 NULL 定义 成 0 将导致 C++ 中重载特性发生混乱。考虑下面这两个函数:
void Function(char *);
void Function(int);
此时如果编译器将NULL定义为0,那么根据重载的特性,Function(NULL)将调用void Function(int);
这明显是不符合道理的!
所以nullptr横空出世,使用它没有什么阵痛,成为了我最喜欢用的新特性。
nullptr
C++11 引入了 nullptr 关键字,专门用来区分空指针、0。而 nullptr 的类型 为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。
代码示例
#include<iostream>
void Function(char *)
{
std::cout << "Function(char*) is called" << std::endl;
}
void Function(int i)
{
std::cout << "Function(int) is called" << std::endl;
}
void main()
{
/***************************************/
//验证编译器将null定位为0还是(void*)0
/***************************************/
if (std::is_same<decltype(NULL), decltype(0)>::value)
{
std::cout << "NULL == 0" << std::endl;
}
if (std::is_same<decltype(NULL), decltype((void*)0)>::value)
{
std::cout << "NULL == (void *)0" << std::endl;
}
if (std::is_same<decltype(NULL), std::nullptr_t>::value)
{
std::cout << "NULL == nullptr" << std::endl;
}
Function(0); // 调用 Function(int)
Function(NULL); //调用 Function(int)
Function(nullptr); // 调用 Function(char*)
}
结论
请直接在给指针初始化空的时候,直接使用nullptr!
本文的代码地址:Modern_Cpp_Practice.
代码持续更新,欢迎下载测试,喜欢的给个star!
本系列将长期更新,希望对您有帮助,本文的代码风格参考Google代码风格,希望对您有借鉴!
以上是关于现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual C++ 2010 中从 C++0x 启用 nullptr?