文章来源 链接
c++ auto类型说明符
编程是常常需要把表达式的值赋给变量,这就要求子再声明变量的时候清楚知道表达式的类型,然而要做到这一点并不容易,有时候根本做不到。为了解决问题,c++11标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式的类型。
与原来那些类型说明符不同,auto让编译器通过初始值来推算变量类型。显然,auto定义的变量必须要有初始值。
使用auto
具有以下好处:
- 可靠性:如果表达式的类型发生更改,也能工作。
- 性能:确保不会进行转换。
- 效率:代码变得高效。
- 可用性:不必担心类型名称拼写困难和拼写有误。
auto it=val1+val2;///有val1和val2相加的结果推断it的类型。
auto i=0,*p=&i;///i是整数,p是整型指针
使用auto
能在一条语句声明多个变量。但是一条语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一致:
auto it=0,pp=3.14///错误
编译器推断出的auto
类型有时候和初始值类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则,例如:
- 使用
auto
会删除引用
int count =10 ;
int &countref = count ;
auto myauto = countref;
countref=11;
cout<<count<<" "; //print 11
myauto =12;
cout<<count<<endl; //print 11
你可能会认为myauto是一个int引用,但她不是,它只是一个int,因为输出为 11 11,而不是11 12;如果auto尚未删除此引用,则会出现此情况。
- const 限定符
先引入一种表述:顶层 const 表示指针本身是一个常量,底层 const 表示指针所指的对象是一个常量。一般auto
会忽略掉顶层 const,同时底层const则会保留下来,例如:
int i = 0;
const int ci = i, &cr = ci;
auto b = ci;///b是一个整数(ci的顶层const特性被忽略掉)
auto c = cr;///c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i;///d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci;///e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
还可以引用类型设置为auto,此时原来的初始化规则仍然适用:
auto &g = ci ; ///g是一个整型常量引用,绑定到ci
auto &h = 42;/// 错误,不能为非常量引用绑定字面值
const auto &j = 42;/// 可以为常量引用绑定字面值
切记,符号 * 和 & 只能从属于某一个声明,而非基本数据类型的一部分,因此初始值必须是同一个类型:
auto k = ci, &l = i;///k是整数,l是整型引用
auto &m = ci, *p = &ci;///m是对整型常量的引用,p是指向整型常量的指针
auto &n = i,*pp = &ci;///错误!i的类型是int,而&ci的类型是const int