目录
一、auto关键字
在C++11中,标准委员会赋予了auto全新的含义:即auto不再是一个存储类型指示符,而是作为一个新的类型。
1.1 auto关键字的实际应用
其实,用自己的话来理解就是auto是使用在一个类型名很长的时候,用利用编译器自动识别它,简化我们代码量。
场景1:
简化代码
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
int x = 0;
auto y = x;//auto自动识别y是int类型
auto z = &x;//auto自动识别z是指针类型
cout << typeid(y).name() << endl;//typeid(y).name()是用来看变量y的类型的
cout << typeid(z).name() << endl;
//auto在类型名很长时,可以用来简化代码,让编译器自动识别。
map<string, string>dict;
//map<string, string>::iterator dit = dict.begin();
auto dit = dict.begin();//以上auto dit 就自动识别了dit的类型是 map<string, string>::iterator
//这样看来,的确是简化了代码量吧
return 0;
}
场景2
范围for
注意点一:
其在使用范围for时对其数据进行改变时,不会影响到原数据。
若想让原数据改变,只需要在auto传参时传引用即可。
代码如下:
for (auto& x : arr) {//如果这里没用使用引用,则不会对原数据有影响。
x *= 3;
cout << x << " ";
}
cout << endl;
注意点二:
auto不能做函数的参数
注意点三:
auto不能直接用来声明数组
指针空值(nullptr)
在编程中,我们在声明一个变量的时候,最好同时给该变量一个合适的初始值,否则可能会出现一些奇奇怪怪的错误。比如,一个未初始化的指针,我们在C中通常会这么对其进行初始化:
int * ptr1 = NULL;
如果你使用的是VsCode编译器,可以点击左键选中NULL,然后点击右键,有个转到定义的选项,点击后可以看到如下代码:
NULL的源码:
由以上可以很清晰的看到,NULL被定义为字面常量 0,或者被定义为无类型指针(void*)常量。
但是,这种定义方法是C98的,我们日常在使用时,不可避免的会遇到一些麻烦。
如下:
NULL的使用局限:
在main中调用函数Fuc(NULL)时,我们本想调用的函数为Fuc(int *),但由于NULL默认情况下被看成一个整形常量,它就会调用Fuc(int)函数。
而使用nullptr则不会产生这样问题了。
(注意,这里定义的Fuc()函数使用了C++中的函数重定义,C语言是无法这样编译的噢!)
注意:
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
2.在C++11中,sizeof(nullptr) 与sizeof((void*)0)所占的字节数相同。
3.为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。