1.1 nullptr nullptr 出现的目的时为了替代 NULL 。在某种意义上说,传统 C++ 会把NULL、0视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为((void*)0), 有些则会直接定义为 0 。
C++ 不允许直接将 void *隐式转换到其他类型,但如果 NULL 被定义为 ((void*)0),那么当编译 char *ch = NULL;时,NULL 只好被定义为 0 。而这依然会产生问题,将导致 C++ 中重载特性发生混乱,考虑:
void foo(char *);void foo(int);
对于这两个函数来说,如果 NULL 又被定义为了 0, 那么 foo(NULL); 这个语句将会去调用 foo(int),从而导致代码违反直观 。
为了解决这个问题,C++11 引入了 nullptr 关键字,专门用来区分空指针、0,nullptr 的类型为 nullptr_t, 能够隐式地转换为任何指针或 成员指针类型,也能和他们进行相等或者不等的比较 。
#include <IOStream>using namespace std;void foo(char *p) { cout << "char*" << endl; }void foo(int p) { cout << "int" << endl; }int main() {char *p = NULL;foo(NULL); // intfoo(nullptr) // char*foo(p); // char*}
nullptr表示空指针,本质还是0,但是具备了类型 。
我们把foo函数改一改:
#include <iostream>using namespace std;void foo(char *p) { cout << "char*" << endl; }void foo(int* p) { cout << "int*" << endl; }void foo(int p) { cout << "int" << endl; }int main() {char *p = NULL;foo(NULL); // intfoo(p); // char*foo(nullptr) // 出现二义性,编译不通过}
验证了nullptr具有空指针类型 。
注:我使用的编译器 NULL 定义如下:
文章插图
文章插图
1.2 constexpr【C++新特性 nullptr 和 constexpr】 C++ 本身具备了常数表达式的概念,比如 1+2、3+4 这种表达式总是会产生相同的结果并且没有任何副作用 。如果编译器能够在编译时就把这些表达式直接优化并植入到程序运行时,将能够增加程序的性能 。
一个非常显著的例子就是在数组的定义阶段:
#define LEN 10int len_foo() {return 5}int main() {char arr_1[10];char arr_2[LEN];int len =5;char arr_3[len + 5]; // 非法const int len_2 = 10;char arr_4[len_2 + 5];// 合法char arr_5[len_foo() + 5]; // 非法return 0;}
在 C++11 以前,在常量表达式中使用的变量必须声明为 const,在上面代码中,len_2 被定义成了常量,因此 len_2+5 是一个常量表达式,所以能够合法的分配一个数组 。而对 arr_5 来说,C++98 之前的编译器无法得知 len_foo() 在运行期实际上返回一个常数,这也就导致了非法的产生 。
即使将 int len_foo() { return 5; } 改为 const int len_foo() { return 5; } 也无济于事 。于是 C++11 引入了 constexpr 关键字,只要
constexpr int len_foo() {return 5;}int main() {char arr[len_foo() + 5]; // 合法}
就可以合法定义数组 。注:有些编译器会“自作聪明”支持可变长数组,我上面使用的 g++ 12.1.0 就能编译通过执行 。但 C++ 标准是不允许的 。所以不建议使用可变长数组,可以使用 vector 代替 。
推荐阅读
- AI加持的新搜索引擎可信吗?
- 电子社保卡升级了!最新使用教程→
- 甘肃疫情最新消息;兰州有多少人感染疫情?
- 张颖颖|张颖颖疑有新欢,打扮性感身材曼妙,在泰国游玩多日心情好
- 盗版|冷知识!漫威DC十大盗版电影,《蜘蛛侠3》和《新蝙蝠侠》登顶
- 女人短发最新发型 2019流行发型
- 新鲜白果如何去壳.白果怎么去壳去皮
- 天猫商家后台入口、天猫商家后台新品基础素材是什么?
- 情满四合院|沈梦辰扎双麻花辫摘草莓,穿着打扮清新感十足,清纯甜美似少女
- 2020歌手最终排名 歌手最新排名