C++ NULL与nullptr的区别

1. C++中NULL的定义:

#ifdef __cplusplus 
#define NULL    0 
#else 
#define NULL    ((void *)0) 
#endif

这么定义的原因:
c++是强类型的语言,不存在由(void*)->(Type*)的隐式转换,而在C语言当中这么是没有问题的
比如函数定义如下:

int func(int *) {}
func((void*)0);           //C++调用失败
func((void*)0);           //C调用成功
func(0);             //C++调用成功

2.由此带来的问题

int func(int *)
{
    cout << "func (int*)" << endl;
}
 
int func(int)
{
    cout << "func (int)" << endl;
}
 
int main () {
    func(NULL);
}

C++中空指针定义如下:int* p = 0;
编译报错如下:
gnu.c:18:11: error: call of overloaded ‘func(NULL)’ is ambiguous
想要避免这个问题,可以改成如下调用:

int main () {
    func(0);
    func(static_cast<int*>(0));
}

输出:
func (int)
func (int*)

3.C++中可以用nullptr解决这个问题

如果没有nullptr我们可以自己实现同样的功能,代码如下:

const
class nullptr_t
{
public:
    //普通变量指针的隐士转换
    template<class T>
    inline operator T*() const
        { return 0; }
    //成员函数指针的隐式转换
    template<class C, class T>
    inline operator T C::*() const
        {return 0; }
 
private:
    void operator&() const;
} nullptr = {};           //定义了一个nullptr_t类常量

测试代码:

class B {
};
 
int func(void (B::*)())
{
    cout << "func (int*)" << endl;
}
 
int main() {
    func(nullptr);       //调用成员函数指针那个隐式转换
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值