赞
踩
转载自:http://www.2cto.com/kf/201404/293503.html
http://www.07net01.com/2015/07/880529.html
【在那些情况下要申明类型】
定义变量类型
函数返回值,函数参数
表达式返回变量类型
【为什么auto】
在开发实践中,有时候我们并不能非常容易地确定一个变量应该具有的数据类型。比如,将某个复杂表达式作为初始值赋值给一个新定义的变量时,我们往往很难确定这个表达式的数据类型,从而无法确定变量应有的数据类型。为了解决这个问题,C++11为我们提供了auto关键字,使用它作为某个变量定义的数据类型,编译器会根据这个变量的初始值,自动推断出这个变量合理的数据类型而无需我们人为指定。
【auto概念详解】
auto关键字——根据初始值推断真实的数据类型。
auto存储类型说明
auto存储类型说明符声明了一个自动变量,auto对象和变量被存储在栈中,它的生命周期仅存在于它的声明所在的块(block)中,即一个只在块运行时有效的变量。一个auto变量仅在声明它的块内是可见的。auto对象和变量对外部模块都是不可见的。auto变量的声明能包含初始化。因为有auto存储类型的变量并不自动的初始化,应该在声明时显式的初始化它们,或在同一个块内赋给它们初始值。未初始化的auto变量的值是未定义的。
【auto关键字原理】
在定义变量的时候必须申明类型,c++是强语言类型,在编译阶段需要知道类型,这样的好处是程序效率更高,而动态语言不需要类型申明的需要自推导变量类型。使用了auto是不是c++效率会变慢?完全不是,因为在编译阶段编译器已经帮程序员推导好了变量的类型。前提条件是编译器可以根据当前的程序的状态推导出变量类型。只是编译器更加智能,我猜想编译时间岂不更长了。
【auto关键字使用场景】
场景一,申明普通变量
auto num = 10;
场景二,函数返回值
如果没有auto,总是要巧那么长的返回值,有了auto关键字后,是不是心里感觉很爽。
vector str_vec;
vector::iterator it_old = str_vec.begin();
auto it_new = str_vec.begin();
场景三,申明函数返回值
auto add(int a, int b)->int {
return a + b;
}
【auto代码使用示例】
auto x = 7; // 使用整数7对变量x进行初始化,x被推断为int类型
auto y = 1.982; // 使用浮点数1.982对变量y进行初始化,y被推断为double类型
Handler GetHandler(); // 使用GetHandler()函数的返回值对变量handler进行初始化
auto handler = GetHandler();// handler被推断为Handler类型
这里我们在定义变量x的时候,并没有指定其具体的数据类型,而是使用auto做为代替。这样,编译器在编译这段代码时,会根据7这个初始值自动推断x的实际数据类型为int。同样的道理,使用浮点数1.982进行初始化的变量y会被编译器自动推断为double类型;而最后的一个变量handler会被初始化为GetHandler()函数的返回值类型Handler。虽然auto关键字会根据初始值自动推断变量的数据类型,但是,它的使用并不需要花费额外的编译时间。
实际上,可以把auto关键字看成是一个变量定义中的数据类型占位符,它占据了原来应该是具体数据类型的位置。而在编译的时候,编译器会根据这个变量的初始值,推断出这个变量应有的具体数据类型,然后替换掉auto关键字,就成为一个普通的带有具体数据类型的变量定义了。用auto关键字定义变量的形式跟一般的定义变量的形式并无二异,唯一的差别之处在于,用auto关键字定义变量时,变量必须有初始值:
auto 变量名 = 初始值表达式; // 赋值形式 // 或 auto 变量名{初始值表达式}; // 初始化列表形式这样,这个初始值表达式计算结果的数据类型将被编译器推断为变量的数据类型。
auto使用需要注意的几个问题
1、使用auto关键字的变量必须有初始值,编译器才能推导出变量类型。
2、在传递const变量的时候,使用auto必须自己加const
const int a =10;
auto b = a; // b的类型是int
const auto c = a; // c 的类型是const int
3、关于很奇葩的函数返回值
auto关键字只能在函数的返回值使用auto关键字,并且在函数尾还需要标注返回类型
这样看起来很奇葩,莫不如不用auto关键字,但我认为委员会的人没这么闲,上google查了下,有下面两条原因:
1、他们认为把返回值放在函数后面更好看(特别是返回值很长的时候)
2、C++14将会把讨人烦得返回值去掉,编译器直接支持自推导。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。