目录
1.auto简介
2.auto的使用
1.auto简介
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么? C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
补充:typid(),用于打印变量的类型
编写如下代码:
所以结论:auto关键字可以自动推导类型。
引入auto的原因:
随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1.类型难于拼写
2.含义不明确容易出错。
如果没有auto,我们通过一个复杂的类型来定义变量:
vector<string> v;
vector<string>::iterator it = v.begin();
如果使用auto关键字:
vector<string> v;
//vector<string>::iterator it = v.begin();
auto it = v.begin();
为什么不使用typedef来实现类型重定义:
首先使用typedef确实可以给类型取别名,也可以简化代码。如下:
不使用typedef
std::map<std::string, std::string> m{ { "apple", "苹果" }, { "orange","橙子" },{"pear","梨"} };
使用后:
typedef std::map<std::string, std::string> Map;
Map m{ { "apple", "苹果" },{ "orange", "橙子" }, {"pear","梨"} };
但是问题在于:编程时往往需要将表达式的值赋值给变量,要求在声明变量时清楚的知道表达质的类型。
2.auto的使用
①使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种类型的声明,而是一个类型声明时的占位符,编译器在编译期间会将auto替换为变量实际的类型。
②auto不可以作为函数的参数。
原因:如果我能调用这个函数的话,auto这个形参的类型就和我们传入的参数的类型保持一致,如果我们不调用函数的话,auto就不能匹配类型。
③auto不能做函数返回值
我们调用一个函数,主要关注的就是函数的返回值和参数,如果返回值的类型不确定,那么我们调用这个函数的结果也是不确定的。
④使用auto声明指针类型的时候,用auto和auto*没有任何区别
⑤使用auto声明引用类型时必须加上&
⑥使用auto在同行声明多个变量的时候,这些变量必须是相同的类型,否则编译器会报错,因为编译器实际只会对同一个类型进行推导,然后使用推导出来的类型定义其他变量。
⑦auto不能用于声明数组,这是一个规定