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); //调用成员函数指针那个隐式转换
}