C++11特性(15):指针空值nullptr

#include <iostream>
 
//指针空值nullptr
/*
     规则:
          1、所有定义为nullptr_t类型的数据都是等价的,行为也完全一致
          2、nullptr_t类型数据可以隐式转换成任意一个指针类型
          3、nullptr_t类型数据不能转换为非指针类型,即使使用reinterpret_cast<nullptr_t>()的方法也不行
          4、nullptr_t类型数据不适用于算术运算表达式
          5、nullptr_t类型数据可以用于关系运算表达式,但仅能与nullptr_t类型数据或者指针类型数据进行比较,当且仅当关系运算符为==,<=,>=等时返回true。
*/
void fun(int)
{
     std::cout << "fun(int)" << std::endl;
}
 
void fun(char*)
{
     std::cout << "fun(char*)" << std::endl;
}
 
template<typename T> void g(T* t){}
template<typename T> void h(T t){}
 
int main()
{
     fun(0);    //fun(int)
     fun(nullptr);      //fun(char*)
     std::cout << "===========================" << std::endl;

     //规则例子
     //nullptr可以隐式转换为char*
     char *cp = nullptr;
 
     //nullptr不能隐式转换为int,任何类型也不能转换为nullptr_t
     int n1 = nullptr; /    /error
     int n2 = reinterpret_cast<nullptr_t>(nullptr);     //error
 
     //nullptr与nullptr_t类型变量可以作比较,当使用==,<=,>=符号作比较时才返回true
     nullptr_t nptr;
     if (nptr == nullptr)     //nullptr_t nptr == nullptr
          std::cout << "nullptr_t nptr == nullptr" << std::endl;
     else
          std::cout << "nullptr_t nptr != nullptr" << std::endl;
     
    if (nptr < nullptr)      //nullptr_t nptr >= nullptr
          std::cout << "nullptr_t nptr < nullptr" << std::endl;
    else
          std::cout << "nullptr_t nptr >= nullptr" << std::endl;
 
     //不能转换为整型或者bool类型
     if (0 == nullptr);     //error
     if (nullptr);     //error
 
     //不能进行算术运算
     nullptr += 1;     //error
     nullptr * 5;     //error
 
     sizeof(nullptr);
     typeid(nullptr);
     throw(nullptr);
 
     //nullptr的类型是是nullptr_t,而不是指针
     //模板只能把nullptr当作一个普通的类型进行推导,并不会将其视为T*指针,如果需要推导出指针类型,必须显式转换类型
     g(nullptr);  //error
     g((float*)nullptr);
 
     h(0);
     h(nullptr);
     h((float*)nullptr);
 
     //nullptr与(void*)0的区别
     /*
          1、nullptr是一个编译时期的常量,它的名字是编译时期的一个关键字,能够为编译器所识别,
               而(void*)0只是一个强制转换表达式,其返回的也是一个void*指针类型。
          2、在C++语言中,nullptr到任何指针的转换都是隐式的,而(void*)则必须经过类型转换后才能使用。
     */
     int *px = (void*)0; //error,不能隐式地将无类型指针转换为int*类型的指针
     int *py = nullptr; //ok
     return 0;
}

====================打个广告,欢迎关注====================

QQ:412425870
csdn博客:
http://blog.csdn.net/caychen
码云:
https://gitee.com/caychen/
github:
https://github.com/caychen

点击群号或者扫描二维码即可加入QQ群:

328243383(1群)



点击群号或者扫描二维码即可加入QQ群:

180479701(2群)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值