auto关键字
1. 什么是auto,auto有什么作用?
我们先来看一段代码:
#include<iostream>
#include<vector>int main()
{using namespace std;vector<int>arr={2,4,6,8};//遍历arr向量for(vector<int>::iterator it=arr.begin();it!=arr.end();it++){cout<<*it<<" ";}cout<<endl;return 0;
}
在这案例中,我们可以看到,声明为迭代器的变量前缀非常长,这样来写代码非常不美观,也不方便。auto的出现很大程度是为了解决该问题。
现在我们来回答刚才的问题:
在C++中,auto
是一个关键字,它的作用是让编译器自动推导变量的类型,根据变量的初始化表达式来确定其类型。这个特性从C++11标准开始引入,被广泛用于简化代码和提高代码的可读性,使用auto关键字可以大大提高我们的编码效率。
下面是使用atuo关键字的代码:
#include<iostream>
#include<vector>int main()
{using namespace std;vector<int>arr={2,4,6,8};//遍历arr向量//auto会自动将it转换成赋值变量的类型for(auto it=arr.begin();it!=arr.end();it++){cout<<*it<<" ";}cout<<endl;return 0;
}
显然,代码变美观和简洁了不少。
2. auto和const
我们先来看一段代码:
int x=0;
const auto n = x;
auto f = n;
const auto & r1=x;
auto r2 = r1;
在第2行代码中,n为const int,auto被推导为int。
在第3行代码中,n为const int类型,但是auto却被推导为int类型,这说明当右边的表达式带有const属性时,auto不会使用const属性,而是直接推导出non-const类型。
第4行代码中,auto被推导为int类型,这个很容易理解,不再赘述。
第5行代码中, r1是const int&类型, auto也被推导为const int类型,这说明当const和引用结合时,auto的推导将保留表达式的const类型。
总结∶
1.当类型不为引用时,auto的推导结果将不保留表达式的const属性;
2.当类型为引用时,auto 的推导结果将保留表达式的const属性。
3. auto的高级用法
auto除了可以独立使用,还可以和某些具体类型混合使用,这样auto表示的就是“半个”类型,而不是完整的类型︰
int x = 0;
auto *pt1 =&x; //pt1为int*, auto推导为int
auto pt2 = &x; //pt2为int*, auto推导为int*
auto &r1 = x; //r1为int&, auto推导为int
auto r2 = r1; //r2为int, auto推导为int
4. auto的使用限制
在C++11中,
1.auto不能在函数的参数中使用
//错误案例
auto test1(int n)
{return n*2;
}
2.auto不能作用于类的非静态成员变量
//错误案例
class test2{public:auto name;auto age;
};
3.auto不能作用于模板参数
#include<iostream>
template<class T>
class Stack{
private:std::vector<T> elements;
public:void push(T value) {elements.push_back(value);}T pop() {T value = elements.back();elements.pop_back();return value;}
}int main()
{//错误案例Stack<auto>s; s.push(1);return 0;
}
4.auto不能用于推导数组类型
#include<iostream>
int main()
{int arr[]={2,3,4,6};auto auto_arr=arr; //错误案例return 0;
}
当然,上诉的限制是在C++11的情况下,其他版本可能有所变化。