C++_2_nullptr关键字(3/3)

本节内容有C的NULL在前面打头阵,学起来犹如探囊取物。

先来分析一段代码,本段代码恰好也结合了上节的宏。

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
f(NULL);//这行代码会调用哪个函数呢
}

分析:可以晓得,两个函数f构成函数重载。函数名都是f;参数不同:第一个函数形参类型int,第二个是int*;而第一句代码f(0),参数是int,自然调用第一个f函数,第二个函数参数为空指针,好家伙,指针类型,可以传第二个f。

运行截图:

好好,都调用的第一个函数,第二行f(NULL)为什么要调用第一个函数?

破案了,因为NULL在cpp编译器下,是一个宏,预处理阶段会替换成0,0是什么类型,int吧,所以传参类型是int,当然也可能会转成C中被定义为⽆类型指针(void*)的常量

那为了调用第二个函数,有人说:“可以把NULL强转成(void*)。”确实,在C语言里面,void*传参,可以传给任意指针类型。但是在C++编译器下,这里把NULL强转成(void*),最后的结果是一个也传不了。因为void* 这个指针类型,是不能转成int*或者其他指针的。

所以C++为了解决NULL在C++下传参这个bug,引进了nullptr这个关键字。

nullptr:

C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。注意,是转成任意其他类型的指针。

咱就是说:“C++也有自己的'NULL'”。

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
f(nullptr);//调用第二个函数
}
    

简而言之,虽然 NULL 在很多情况下与 0 等价,但它们在C++中的类型和用途是不同的,而且推荐使用 nullptr 来代替 NULL 和 0 作为空指针常量。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值