C++11---nullptr
1.nullprt与NULL
代码:
void f(int i) { cout << "f(int)" << endl;}
void f(char* c) { cout << "f(char*)" << endl;}int main () {
f();
f('\0');
// f(NULL); 在我的GCC中编译不过,因为NULL被认为是(void*)0,二义性
// f((void*)0); 二义性
f(nullptr);
;
}
结果:
因为NULL容易出问题,因此出现了nullptr。nullptr是有类型的,并且可以被隐式转化为指针类型。
额外:NULL,0,'\0' 的区别
NULL在 "stdio.h" 中的定义如下:
#ifndef __cplusplus #define NULL ((void *)0) #else /* C++ */ #define NULL 0 #endif /* C++ */
说明NULL在C中是(void*)0,而在C++中是0.
注意:0对于指针来说是一个特别对待的值,"当常量0处于应该作为指针使用的上下文中时,它就作为空指针使用“
如下程序所示;
int main () {
void* p;
p = 0;
//p = 1; 这里报错了,虽然与0都是int类型
cout << p << endl;
return 0;
}
而'\0'是所有位都是0的字节,在ASCII码表中所示如下:
有趣的情况:C的字符串是用'\0'结尾的,而有的系统(比如Ubuntu14.04)用NULL也能结束(不过这在其他系统不一定能行得通):
int main () {
char str[3];
str[0] = 'a';
str[1] = 'b';
cout << str << endl;
str[2] = '\0';
cout << str << endl;
str[2] = 0;
cout << str << endl;
return 0;
}
结果:
这三个都是表现出0,但是你的0不是我的0,如下代码:
int main () {
cout << "\\0的大小: " << sizeof('\0') << endl;
cout << "0的大小: " << sizeof(0) << endl;
cout << "NULL的大小:" << sizeof(NULL) << endl;
return 0;
}
结果:
总:这三者都是零,但是NULL是16进制的0(对于C来说这是(void*)0,是指针),0是10进制的0,'\0'是8进制的0
PS:上面NULL可以替代'\0'的情况可以理解为,在二进制中,NULL是16个0而'\0'是8个0,NULL可以截断最后8位成为'\0'。
2.nullptr是关键字
3.nullptr的类型是nullptr_t
使用nullptr_t需要包含<cstddef>,其定义为typedef decltype(nullptr) nullptr_t;
使用nullptr_t可以定义多个指针空值,而不仅仅是nullptr一个(虽然nullptr已经够用了)
int main () {
nullptr_t myNull;
f(myNull);
;
}
规则:
- nullptr_t类型数据可以隐式转换成任意一个指针类型。
- nullptr_t类型数据不能转换为非指针类型,即使reinterpret_cast
- nullptr_t类型数据不适用于算术运算表达式。
- nullptr_t类型数据适用于关系算术表达式,但仅能与nullptr_t和指针类型比较。
4.nullptr与模板
模板只把nullptr作为一个普通的类型进行推导(并不会视为T* 指针)
template<typename T> void g(T* t) { cout << sizeof(T) << endl;}
template<typename T> void h(T t) { cout << sizeof(T) << endl;}
int main () {
// g(nullptr); 类型是nullptr_t而不是指针
g(();
g((int*)nullptr);
h();
h(nullptr);
h((int*)nullptr);
;
}
5.规定sizeof(nullptr_t) == sizeof(void*)
nullptr是一个编译时期的常量,是编译时期的关键字,能被编译器识别。(void*)0需要经过类型转换才能变成其他指针类型。
6.nullprt地址
- 可以打印nullptr_t对象的地址
- 不能直接打印nullptr的地址
- 可以打印nullptr的右值引用的地址
代码:
int main () {
nullptr_t my_null;
cout << &my_null << endl; //可以打印nullptr_t的地址
// cout << nullptr << endl; 错误
const nullptr_t &nullptr_r = nullptr; //可以打印nullptr的右值引用地址
cout << &nullptr_r << endl;
;
}
参考书籍:《深入理解C++11》
C++11---nullptr的更多相关文章
- C++ 11 nullptr关键字
熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作.如果暂时不明确该指针指向哪个变量,则需要赋予NULL值.除了NUL ...
- C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- C++11 并发指南一(C++11 多线程初探)(转)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- 【C/C++开发】C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...
- C++学习笔记28:运行期型式信息
RTTI 运行期标识对象的型式信息 优势:允许使用指向基类的指针或引用自如地操作派生类的对象 typeid:获取表达式的型式:type_info:型式信息类 头文件:typeinfo 对象转型模板 d ...
- 译注(3): NULL-计算机科学上最糟糕的失误
原文:the worst mistake of computer science 注释:有些术语不知道怎么翻译,根据自己理解的意思翻译了,如有不妥,敬请提出:) 致谢: @vertextao @fra ...
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- C++11 之 nullptr
C++11 中,nullptr 是空指针,可用来给 (指向任意对象类型的) 指针赋值 广义整型 (integral types) = char, short, int, long, long long ...
- c++11编码规范 NULL还是nullptr
0和nullptr/NULL 至于指针(地址值),根据实际选择用0.NULL还是nullptr.对使用了C++11特性的项目,选用nullptr:对于C++03项目,推荐NULL,因为它像是一个指针
随机推荐
- Floyd_Warshall POJ 3660 Cow Contest
题目传送门 题意: m组关系,A能打败B,问最后有几头牛的排名能确定 分析:如果排名确定,那么能打败它的到它一定通,它到能打败的一定能通,也就是和为n-1.用Floyd的传递闭包 #include & ...
- Hadoop2.0(HDFS2)以及YARN设计的亮点
YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResouceManager负责对各个Node ...
- BZOJ2965 : 保护古迹
首先要将这个图连通,方法是通过扫描线+set求出每个连通块最高的点上方的第一条边,然后向交点连边. 然后把边拆成两条双向边,每次找到一条没走过的边,找到极角排序后它的反向边的后继,直到回到这条边. 根 ...
- hadoop2.2.0 + hbase 0.94 + hive 0.12 配置记录
一开始用hadoop2.2.0 + hbase 0.96 + hive 0.12 ,基本全部都配好了.只有在hive中查询hbase的表出错.以直报如下错误: java.io.IOException: ...
- Spring AOP报错处理 Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
[转] 解决方法: http://forum.springsource.org/showthread.php?85016-IllegalArgumentException-with-Applicati ...
- ACM 6174问题
6174问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替 ...
- ACM: 限时训练题解-Epic Professor-水题
Epic Professor Dr. Bahosain works as a professor of Computer Science at HU (Hadramout Universit ...
- 【BZOJ】2212: [Poi2011]Tree Rotations
题意 给一棵\(n(1 \le n \le 200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 分析 可以发现如果交换非叶结点的左右子树,对子树内的交换无影响, ...
- 【BZOJ】3105: [cqoi2013]新Nim游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...
- Codeforces Beta Round #2
A题,神题意题.. #include <iostream> #include <cstdio> #include <cstring> #include <st ...