一.auto关键字
1.意义:通过初始化的对象自动推导变量类型。
既然是通过初始化来推导,那么用auto关键字定义的变量就必须初始化。
2.用法:
auto a = 10;
cout << typeid(a).name() << endl;
auto b = 1.2;
cout << typeid(b).name() << endl;
auto c = (int *)20;
cout << typeid(c).name() << endl;
//定义指针变量
auto p = &a;
cout << typeid(p).name() << endl;
auto* ptr = &a;
cout << typeid(ptr).name() << endl;
//定义引用
auto r = a;
cout << typeid(r).name() << endl;
auto& ra = a;
cout << typeid(ra).name() << endl;
输出结果是这样的:
但是我们发现:
这两种定义引用的方式是不是有什么问题?
分析:
引用既然是变量的别名,并且一个实体可以有多个引用,那么引用所对应的实体的地址应该是相同的。
结论:
用auto定义引用的格式是:auto & 变量名=某个实体;
注意:
1.auto不能用来声明函数的参数。
原因:
①在函数的重载中我们知道,函数重载的方法是C++中对函数名的修饰规则是函数名与函数参数类型结合的方式来确定一个函数。但是用auto声明的变量,它的类型是未知的。
②不知道参数类型大小,那么在函数压栈的过程中,栈帧的大小是不能确定的。
2.auto不能用来声明数组。
3.auto定义引用必须加上&。
二.nullptr关键字
1.意义:空指针。与C语言中的NULL一模不一样。
在写链表时,malloc所开辟的内存空间都用free来释放,但是为了防止造成野指针问题,我们通常让释放后的指针指向空。
也就是为其赋值为NULL;
但是,我们观察以下代码:
第一句为指针变量初始化成空,没有问题;但是用NULL为整形变量初始化或者赋值这就有些过分了。
当我们转到NULL的定义就会发现:
NULL只是一个值为0的宏而已,那么这种做法其实是有些不科学的。
C++中引入了关键字nullptr来解决这个问题
nullptr的实质就是指针类型的变量,32位下大小是4B,64位下大小是8B。
所以C++中是不允许nullptr为非指针变量赋值的。
三.范围for
1.意义:遍历数组。
如:我们一般遍历数组的方式是这样的。
int arr[] = { 1,2,3,4,5,6,7,8,9 };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) {
cout << arr[i] << " ";
}
cout << endl;
那么在C++中,引入了for范围就见便利许多
for (int i : arr) {
cout << i << " ";
}
cout << endl;
执行结果如下:
我们发现两者的效果是一样的,而且第二种写法较为简单。
注意:
1.for的对象必须有++和==操作。
2.数组的范围必须已知。
3.只能遍历整个数组;不能遍历其中的几个。(开始了就停不下来了,除非到了尽头)。