auto关键字(C++11)
文章目录
- auto关键字(C++11)
- 前言
- 一、auto使用规则
- 二、auto不适用的场景
- 三、auto推荐适用的场景
- 总结
前言
在C++11中,auto关键字能够自动推导出变量的实际类型,可以帮助我们写出更加简洁、现代的代码。
一、auto使用规则
- C++中auto关键字并不代表一种实际的数据类型,只是一个类型声明的"占位符",auto的使用场景也有限制,并不是万能的,使用auto声明的变量必须进行初始化,只有这样才能让编译器根据初始化的值推导出变量的实际数据类型,在编译时将auto占位符替换成真正的数据类型。
- auto还可以跟指针和引用结合起来,搭配上const、volatile限定符,在不同的场景有对应的推导规则,规则内容如下:
当变量不是指针或者引用类型时,推导的结果中不会保留const、volatile关键字;当变量是指针或者引用类型时,推导的结果中会保留const、volatile关键字
语法如下:
// var--变量名;value--变量值
auto var=value;
示例程序:
#include <iostream>
using namespace std;int main()
{// 无const修饰auto var = 3.14;auto var1 = 100;auto var2 = 'z';auto var3; //错误❌,使用auto关键字必须初始化return 0;
}
鼠标放在变量上会自动显示编译器推导出的数据类型。
指针和引用的auto推导示例代码:
#include <iostream>
using namespace std;int main()
{// 带指针和引用的auto使用int var = 100;//&var:int* ; auto:intauto* var1 = &var;//var:int ; auto:intauto& var2 = var;//&var:int* ; auto:int*auto var3 = &var;//var:int ; auto:intauto var4 = var;// auto在const情况下的使用//var:int ; auto:int ; var5:const intconst auto var5 = var;//var5:const int ; auto:int ; var6:intauto var6 = var5;//var:int ; auto:int ; var7:const intconst auto& var7 = var;//var7:const int ; auto:const int ; var8:const intauto& var8 = var7;//var7:const int ; auto:const int ; var9:const int*auto* var9 = &var7;return 0;
}
备注:
指针常量和常量指针的区别:
指针常量(int* const):指针的指向不可以改变,指针指向的值可以改变。
常量指针(const int*):指针的指向可以改变,指针指向的值不可以改变。
可以通过这一句话记忆,指针常量,即指针是常量;常量指针,即常量的指针。
二、auto不适用的场景
- 不能用于函数的形参数据类型的推导。因为函数的形参的初始化只有在函数被调用时才会被传递实参,因此二者矛盾。
void fun(auto a) //错误❌
{cout<<a<<endl;
}
- 不能用于类的非静态常量变量的初始化。因为类的非静态成员(不属于类,属于类对象的)的初始化只有在类创建对象时才会成立,另外静态非常量成员的初始化要在类外实现,因此auto都不可以用来推导这两种类型的推导。
class Test {auto var = 0; //错误static auto var1 = 100; //错误,类的静态非常量成员的初始化不允许在类的内部static const auto var2 = 200; //类的静态常量成员初始化可以在类的内部完成
};
- 不能用auto关键字定义数组
int main()
{int array[] = { 1,2,3,4 }; //定义数组auto var = array; //auto:int *auto var1[] = array; //错误❌,auto不能用来定义数组auto var2[] = { 1,2,3,4 }; //错误❌,auto不能用来定义数组return 0;
}
- 无法使用auto推导出模板参数类型
template<class T>
class Test {T t;
};int main()
{Test<double> t;Test<auto> t1 = t; //错误❌,auto无法推导出类模板类型return 0;
}
三、auto推荐适用的场景
- 用于STL容器的遍历
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);//STL容器遍历//vector<int>::iterator it=vec.begin();auto it = vec.begin(); //auto自动推导迭代器类型,代码简洁for (; it < vec.end(); it++){cout << *it << endl;}return 0;
}
- 用于接收模板函数的返回值
#include <iostream>
#include <vector>
using namespace std;class Test
{
public:static int get(){return 10;}
};class Test1
{
public:static string get(){return "hello world";}
};template <class T>
void func()
{auto ret=T::get();cout << ret << endl;
}int main()
{func<Test>();func<Test1>();return 0;
}
总结
本文主要介绍了auto的使用、带指针和引用的auto的使用以及注意事项、推荐使用的场景,欢迎有问题交流。