C++学习笔记之nullptr

67 views

相关样例代码来自于C++11 nullptr:初始化空指针

从C语言转向C++语言开发的程序员,想必对NULL并不陌生。
NULL是C++语言兼容C语言代码的妥协之一,因此使用现代C++语言编程时,假如编译器允许,应当尽可能使用nullptr替代NULL

nullptr的几个要点:

  • nullptr是C++11新增的关键字,因此老版本的C++编译器可能不支持。部分版本的编译器,可能需要特定的编译选项才能启用对nullptr的支持。
  • nullptr_t是C++11新增的数据类型,专用于表示nullptr类型的数据。
  • 不同类型的指针,都可以使用nullptr来初始化,编译器会自动实现类型转换。
  • nullptr无法自动转换为整型等数值类型,因此与NULL不相同。

如下是实验代码一:

#include <iomanip>
#include <iostream>
#include <optional>
#include <string>
#include <vector>
using namespace std;

void isnull(void *c) { cout << "void*c" << endl; }
void isnull(int n) { cout << "int n" << endl; }
int main() {
    isnull(0);
    isnull((void *)NULL);
    isnull((void *)0);
    isnull(nullptr);
    return 0;
}

上述代码使用gcc 11.2.0版本可以正常编译,执行结果如下:

int n
void*c
void*c
void*c

如下是实验代码二:

#include <optional>
#include <string>
#include <vector>
using namespace std;

void isnull(void *c) { cout << "void*c" << endl; }
void isnull(int n) { cout << "int n" << endl; }
int main() {
    isnull(0);
    isnull(NULL);
    return 0;
}

上述代码使用gcc 11.2.0版本编译时提示有编译错误,样例如下:

main.cpp: In function ‘int main():
main.cpp:12:11: error: call of overloaded ‘isnull(NULL)’ is ambiguous
   12 |     isnull(NULL);
      |     ~~~~~~^~~~~~
main.cpp:8:6: note: candidate:void isnull(void*)8 | void isnull(void *c) { cout << "void*c" << endl; }
      |      ^~~~~~
main.cpp:9:6: note: candidate:void isnull(int)9 | void isnull(int n) { cout << "int n" << endl; }
      |      ^~~~~~

高版本的编译器,语法检查的功能更加强大,可以提前发现更多的问题。



若非注明,均为原创,欢迎转载,转载请注明来源:C++学习笔记之nullptr

关于 JackieAtHome

基层程序员,八年之后重新启航

此条目发表在 读书笔记 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud