1. auto 的定义
在c/c++11之前,auto用来修饰局部变量,表明该变量是一个自动变量,函数结束后该变量销毁
c++11中,赋予auto全新的含义。其中表示:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译时会将auto替换为自动推导的类型
auto关键字修饰的变量,具有自动存储器的局部变量
2. 如何使用 auto
auto 通常是为了简化代码,不过也牺牲了一些代码可读性,所以要适当进行一些注释
auto 通常简化的都是一些较长的类型,日常所见的 int、char、double 等可以不用auto
//auto 的用法
int main()
{map<string,string> dict;//这里可以直接使用 auto 自动推导 map<string,string>::iteratormap<string, string>::iterator mit = dict.begin();auto mit = dict.begin();return 0;
}
3. 使用 auto 的注意事项
1. 根据初始化表达式自动推导实际数据类型
2. 一定要在定义时对其进行初始化3. auto在声明指针类型时,使用auto和使用auto*都可以,但用auto声明引用类型时
则必须加&
4. 要注意的是,如果auto在同一行声明多个变量,要保证在同一行的多个变量类型相同,否 则会报错
5. auto不能作为函数定义时参数的类型,编译器无法对定义时参数的类型进行推导
6. auto不能直接声明数组
代码演示如下:
1. 根据初始化表达式自动推导实际数据类型
int main()
{//1.根据初始化表达式自动推导实际数据类型auto i = 1;cout << "i = " << i << endl;cout << "i的数据类型是" << typeid(i).name() << endl;auto ch = 'A';cout << "ch = " << ch << endl;cout << "ch的数据类型是" << typeid(ch).name() << endl;auto db = 3.14;cout << "db = " << db << endl;cout << "db的数据类型是" << typeid(db).name() << endl;return 0;
}
2. 一定要在定义时对其进行初始化
int main()
{//2.一定要在定义时对其进行初始化 auto x;x = 1;return 0;
}
3. auto在声明指针类型时,使用auto和使用auto*都可以,但用auto声明引用类型时则必须加&
int main()
{//3.auto在声明指针类型时,使用auto和使用auto* 都可以,但用auto声明引用类型时则必须加 &auto m = new int(1);cout << "m = " << m << endl;cout << "m的数据类型是" << typeid(m).name() << endl;auto* n = new int(2);cout << "n = " << n << endl;cout << "n的数据类型是" << typeid(n).name() << endl;int i = 3;cout << "i = " << i << endl;cout << "i的数据类型是" << typeid(i).name() << endl;auto& j = i;cout << "j = " << j << endl;cout << "j的数据类型是" << typeid(j).name() << endl;return 0;
}
4. 要注意的是,如果auto在同一行声明多个变量,要保证在同一行的多个变量类型相同,否则会 报错
int main()
{//4.要注意的是,如果auto在同一行声明多个变量,要保证在同一行的多个变量类型相同,否则会报错auto i = 1, j = 2;//i j 都是 int 类型,可以声明在同一行auto x = 1.0, y = 3.14f;//i 是 double 类型,y 是 float 类型,两变量类型不同会报错return 0;
}
5. auto不能作为函数定义时参数的类型,编译器无法对定义时参数的类型进行推导
class A
{
private:int i;int j;
public:int Add(auto i, auto j);
};
6. auto不能直接声明数组
int main()
{//6.auto不能直接声明数组auto* a = new auto [10];int* b = new int[10];return 0;
}