auto
auto:自动推导类型功能
1.在早期
C/C++
中
auto
的含义是:使用
auto
修饰的变量,是具有自动存储器的局部变量,后来这个
不重要了。
C++11
中,标准委员会变废为宝赋予了
auto
全新的含义即:
auto
不再是一个存储类型
指示符,而是作为一个新的类型指示符来指示编译器,
auto
声明的变量必须由编译器在编译时期
推导而得;
int main()
{
auto a = 1;
auto b = 1.1;
auto c = 11111111111111111111;
auto d = 's';
auto e = "hello world";
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(e).name() << endl;
return 0;
}
2.用
auto
声明指针类型时,用
auto
和
auto*
没有任何区别,但用
auto
声明引用类型时则必须加
&
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际
只对第一个类型进行推导,然后用推导出来的类型定义其他变量;
auto a;//不可以这么定义,应为不知道要开多大的空间
int main()
{
int a = 0;
auto pa = &a;
auto* _pa = &a;
auto& ppa = a;//引用必须+&
//auto a = 1, b = 1.1;//多变量,类型不同,会报错
cout << typeid(a).name() << endl;
cout << typeid(pa).name() << endl;
cout << typeid(_pa).name() << endl;
cout << typeid(ppa).name() << endl;
return 0;
}
3.auto
不能作为函数的参数,可以做返回值,但是建议
谨慎使用
;
//auto不能做参数
void fun1(auto a)
{
//报错
}
//auto可以做返回值
auto fun2()
{
int a = 1;
return a;
}
谨慎使用:(有坑)EG:(不断调用才知道类型,效率低)
auto fun1()
{
return 1;
}
auto fun2()
{
//..
return fun1;
}
auto fun3()
{
//..
return fun2();
}
int main()
{
auto ret = fun3();
return 0;
}
4.auto
不能直接用来声明数组;
auto arr[] = { 1,2,3 };//报错
范围for
1.对于一个
有范围的集合
而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的
for
循环。
for
循环后的括号由冒号
“
:
”
分为两部分:第一部分是范围
内用于迭代的变量,第二部分则表示被迭代的范围
,自动迭代,自动取数据,自动判断结束;
2.范围
for
可以作用到
数组
和
容器对象(主要)
上进行遍历;
3.范围
for
的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到;(不过,对迭代器进行修改会改变原有对象的值,而范围for却没有修改原有对象的值)(因为范围for的底层变换成迭代器后,会自动取原有对象的数据,给到for对象,for对象仅仅是对原有数据的拷贝,相当于是个局部对象,出了作用域就被销毁了,并没有修改原有对象的数据;而迭代器是类似指针的,会修改原有对象)
EG:
#include<iostream>
#include<string>
using namespace std;
void test_string1()
{
string s("hello world");
cout << s << endl;;
//迭代器
string::iterator it = s.begin();
while (it != s.end())
{
//*it += 2;
cout << *it << " ";
it++;
}
cout << endl;
//范围for:所有容器都支持
//从s中取字符给ch
for (auto ch : s)
{
ch += 2;
cout << ch << " ";
}
cout << endl;
cout << s << endl;
}
int main()
{
test_string1();
return 0;
}
如果想用范围for进行对原有变量进行修改,应该使用引用:
for (auto& ch : s)
{
ch += 2;
cout << ch << " ";
}