C++入门新增nullptr关键字详解

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门新增nullptr关键字详解相关的知识,希望对你有一定的参考价值。

1、C和C++中NULL的区别

#ifdef _cplusplus // 定义这个符号就表示当前是C++环境
#define NULL 0 // 在C++中NULL就是0
#else
#define NULL (void *)0 // 在C中NULL是强制类型转换为void *的0
#endif

(1)虽然NULL在C/C++的本质都是二进制0,但是在C中NULL是指针类型,在C++中就是纯粹的数字0;
(2)在C/C++中NULL本意是用来当做空指针,但是在C++中NULL却是纯数字0,这就有问题了;
(3)注意NULL不是关键字,而是宏定义;
(4)C++不允许void *隐式转为int *等类型;
参考博客:《c语言中NULL到底是什么?》

2、NULL在C++中带来的歧义

2.1、示例代码

#include <iostream>
using namespace std;

//传参是int型变量
void func(int x) 
    cout<<"void func(int x)"<<endl;

 
//传参是指针变量
void func(char *y) 
    cout<<"void func(int *y)"<<endl;

 
int main()

    func(NULL);
    return 0;

2.2、报错原因分析

[root#]$ g++ test.cpp 
test.cpp: In function ‘int main():
test.cpp:14: error: call of overloaded ‘func(NULL)’ is ambiguous
test.cpp:4: note: candidates are: void func(int)
test.cpp:8: note:                 void func(char*)

(1)报错原因是函数重载时调用不明确;
(2)NULL在C++中是纯数字0,应该调用void func(int x)函数;但是NULL在用法上是用来表示空指针,调用void func(char *y)也说的过去。所以在两种解释都可以的情况下,产生冲突,编译器直接报错;

3、C++引入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=;

(1)nullptr关键字是c++11引入的,注意nullptr是关键字而NULL是宏定义;
(2)nullptr传参,表示真正的空指针,作用就是C语言里的NULL,在C++中空指针用nullptr,目的就是解决上面NULL带来的歧义;
(3)在编译程序时,需要指定C++的版本不低于c++11,比如:g++ -std=c++11 test.cpp;

4、nullptr的示例代码

#include <iostream>
using namespace std;

//传参是int型变量
void func(int x) 
    cout<<"void func(int x)"<<endl;

 
//传参是指针变量
void func(char *y) 
    cout<<"void func(int *y)"<<endl;

 
int main()

    func(0);
	func(nullptr);
    return 0;

5、输出结果

void func(int x)
void func(int *y)

6、推荐

我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题

以上是关于C++入门新增nullptr关键字详解的主要内容,如果未能解决你的问题,请参考以下文章

C++入门篇引用&&内联函数&&auto&&范围for&&nullptr

C++入门

C++入门C++和C语言比较:新增的和有变化的关键字

C++入门C++和C语言比较:新增的和有变化的关键字

C++从入门到入土第二篇:C++入门(续)

C++入门篇之引用,内联函数,auto和范围遍历