c++ 11 nullptr
c++指针的使用,在所有教材中都提倡声明的时候要初始化,防止“野指针”,如果不明确该指针指向变量,则直接赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:
如下:
int *t1 = NULL; // 需要引入cstdlib头文件
int *t2 = 0;
int *t3 = nullptr;
为什么C++11要引入nullptr
新标准中建议使用nullptr代替NULL来声明空指针。
1.NULL在C++中的定义:
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
可以看到,在C++中 NULL 被定义为 0 ,而在C中,NULL被定义为((void *)0),即一个void指针。
C++是兼容C的,为什么对于NULL C++却不完全兼容C呢?通过一顿搜索,才知道之所以这样,跟C++的函数重载机制有关。看下面这段代码:
void Fun(char *);
void Fun(int);int main()
{Fun(NULL);
}
如果C++让NULL也支持void *的隐式类型转换,这样编译器应该调用哪一个函数呢。
C++把NULL定义为0,避免了上面的参数匹配问题,但是有引入了新问题,看下面这段代码:
void Fun(char *);
void Fun(int);int main()
{Fun(NULL); // 调用Func(int)
}
我们经常用NULL来初始化空指针,从传统来说,Fun应该调用的是void Fun(char *)
才跟我们的习惯相符,但实际上C++中NULL的值是0,所以实际调用的是void Fun(int);
。考虑到如上问题,nullptr关键字被引入了。
请注意区别:
NULL只是一个宏定义,而nullptr是一个C++关键字,是std::nullptr_t类型的(constexpr)变量。
nullptr如何使用
nullptr关键字用于标识空指针。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。
char *p1 = nullptr; // 正确
int *p2 = nullptr; // 正确
另外需要注意 nullptr与bool的转化,或int的转化,不同的编译器的结果不同,笔者在vs2022上测试时,直接报错:
bool b = nullptr;
int a = nullptr;
error C2440: “初始化”: 无法从“nullptr”转换为“bool”
c++ 11 nullptr相关推荐
- C++ 11 nullptr关键字
C++ 11 nullptr关键字 转载:https://www.cnblogs.com/DswCnblog/p/5629073.html 熟悉C++的童鞋都知道,为了避免"野指针" ...
- C++11 nullptr与常量表达式constexpr记录
1.nullptr (1) nullptr是一个关键字,而nullptr_t是一个类型 typedef decltype(nullptr) nullptr_t 使用nullptr_t类型必须包含#in ...
- 在c++11中讨论nullptr和NULL
C++ 11 nullptr关键字 熟悉C++的童鞋都知道,为了避免"野指针"(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作.如果暂时不 ...
- C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- C++11新特性以及std::thread多线程编程
一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...
- C++11新特性选讲 语言部分 侯捷
C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...
- C++11、C++14、C++17、C++20新特性总结(5万字详解)
文章目录 C++ 11是什么,C++ 11标准的由来 C++ auto类型推导完全攻略 auto 类型推导的语法和规则 auto 的高级用法 auto 的限制 auto 的应用 使用 auto 定义迭 ...
- c语言null和nullptr,nullptr和NULL
nullptr是c++11中的关键字,表示空指针 要区分nullptr和NULL,首先要明白NULL的含义: NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中 ...
- C语言nullptr错误,C ++中的nullptr到底是什么
对于有经验的C ++和那些了解现代C ++编程语言的人来说,C ++中的nullptr到底是什么,这将是非常简单的问题.但是nullptr不仅是C ++中的编程语言,而且为了解释这一点,我们先了解一下 ...
最新文章
- Nginx 缓存命中率
- android人脸识别源代码,Android自带的人脸识别
- python使用说明书-InfluxDB——python使用手册
- nltk.download(“stopwords“)
- D3D中的粒子系统(4)
- 金融学习纲要与相关知识
- [css] 要是position跟display、overflow、float这些特性相互叠加后会怎么样?
- LiDAR点云数据处理(TLS/MLS/ALS)
- 编译分析:提memcmp.c+gcc四十米大刀到C#世界中屠龙
- 前端性能监控方案window.performance 调研(转)
- 技嘉主板bios设置内存图解
- 计算机复试专业课笔试,关于计算机考研专业课的考试内容
- 2022年上海房地产研究报告
- 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
- icon小图标集合网站
- mysqlfrm初步使用
- C语言学习(三)运算符、表达式和语句
- 鲁大师发布2022半年报手机UI排行榜:vivo OriginOS成为最流畅UI
- 在多线程应用程序中使用循环缓冲区高效地进行日志记录
- python google 搜索结果爬取_python爬取百度谷歌搜索结果