C++11中longlong超长整型和nullptr初始化空指针 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 目录本文介绍 C++11 标准中新添加的 long long 超长整型和 nullptr 初始化空指针。
1. C++11:long long 超长整型C++ 11 标准中,基于整数大小的考虑,共提供了如下表所示的这些数据类型。与此同时,标准中还明确限定了各个数据类型最少占用的位数。
C++11 标准规定,每种整数类型必须同时具备有符号(signed)和无符号(unsigned)两种类型,且每种具体的有符号整形和无符号整形所占用的存储空间(也就是位数)必须相同。不过需要注意的是,C++11 标准中只限定了每种类型最少占用多少存储空间,不同的平台可以占用不同的存储空间。 在上表罗列的这些数据类型中,long long 超长整型是 C++ 11 标准新添加的。其实早在 1995 年,就有人提议将 long long 整形写入 C++ 98 标准,但被委员会拒绝了。而后 long long 整形被 C99 标准(C语言标准之一)采纳,并逐渐被很多编译器支持,于是 C++ 标准委员会重新决定将 long long 整形写入 C++ 11 标准中。 如同 long 类型整数需明确标注 L 或者 l 后缀一样,要使用 long long 类型的整数,也必须标注对应的后缀:
如果不添加任何标识,则所有的整数都会默认为 int 类型。 对于 long long 类型来说,如果想了解当前平台上 long long 整形的取值范围,可以使用
?
程序执行结果为(不唯一):
?
此程序中,输出了各最大值和最小值对应的十六进制,显然在当前平台(Windows10 64位操作系统)上,long long 超长整型占用 64 位(也就是 16 个字节)的存储空间。
2. C++11:nullptr 初始化空指针实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。 所谓“野指针”,又称“悬挂指针”,指的是没有明确指向的指针。野指针往往指向的是那些不可用的内存区域,这就意味着像操作普通指针那样使用野指针(例如 p),极可能导致程序发生异常。 C++98/03 标准中,将一个指针初始化为空指针的方式有 2 种:
?
可以看到,我们可以将指针明确指向 0(0x0000 0000)这个内存空间。一方面,明确指针的指向可以避免其成为野指针;另一方面,大多数操作系统都不允许用户对地址为 0 的内存空间执行写操作,若用户在程序中尝试修改其内容,则程序运行会直接报错。 C++ 中将 NULL 定义为字面常量 0,虽然能满足大部分场景的需要,但个别情况下,它会导致程序的运行和我们的预期不符。例如:
?
程序执行结果为:
对于 isnull(0) 来说,显然它真正调用的是参数为整形的 isnull() 函数;而对于 isnull(NULL),我们期望它实际调用的是参数为 void*c 的 isnull() 函数,但观察程序的执行结果不难看出,并不符合我们的预期。
?
如此,才会成功调用我们预期的函数。 由于 C++ 98 标准使用期间,NULL 已经得到了广泛的应用,出于兼容性的考虑,C++11 标准并没有对 NULL 的宏定义做任何修改。为了修正 C++ 存在的这一 BUG,C++ 标准委员会最终决定另其炉灶,在 C++11 标准中引入一个新关键字,即 nullptr。 在使用 nullptr 之前,需保证自己使用的编译器支持该关键字。以 Visual Studio 和 codeblocks 为例,前者早在 2010 版本就对 C++ 11 标准中的部分特性提供了支持www.lu0.com,其中就包括 nullptr;如果使用后者,则需将其 G++ 编译器版本至少升级至 4.6.1(同时开启 -std=c++0x 编译选项)。 nullptr 是 nullptr_t 类型的右值常量,专用于初始化空类型指针。nullptr_t 是 C++11 新增加的数据类型,可称为“指针空值类型”。也就是说,nullpter 仅是该类型的一个实例对象(已经定义好,可以直接使用),如果需要我们完全定义出多个同 nullptr 完全一样的实例对象。 值得一提的是,nullptr 可以被隐式转换成任意的指针类型。举个例子:
?
显然,不同类型的指针变量都可以使用 nullptr 来初始化,编译器分别将 nullptr 隐式转换成 int*、char* 以及 double* 指针类型。 另外,通过将指针初始化为 nullptr,可以很好地解决 NULL 遗留的问题,比如:
?
|