编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而要做到这一点并非那么容易,有时根本做不到。
c++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属类型。
例如:
int a=3,b=2;
auto s=a+b;
因为两个变量类型是int ,所以 s的类型也就是int。
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- string s("some string");
- for(auto c:s) //for循环把变量c和s联系起来,通过使用auto,c的类型为char,每次迭代,s的下一个字符被拷贝给c,
- cout<<c<<endl; //因此循环可以读作“对于字符串是s中的每个字符c”
- system("pause");
- return 0;
- }
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- string s("some string");
- for(auto &c:s)
- c=toupper(c);//c是一个引用,因此赋值语句将改变s中的字符
- cout<<s<<endl;
- system("pause");
- return 0;
- }
总的来说auto关键字主要有两个用处,第一个就是自动类型推断,第二个是返回值占位符。废话不多说,先来看一段代码:
- ///////////////////////////////////auto的自动类型推断实例///////////////////////////////////
- //使用auto初始化变量
- auto a = 10;
- printf("a = %d",a);
- auto b("auto");
- printf("b = %s",b);
- //使用auto消除冗长
- map<string,vector<int> > _map;
- map<string, vector<int> >::const_iterator itr1 = _map.begin();
- auto itr2 = _map.begin();
- //使用auto声明lambda表达式
- auto func = [](){printf("auto!!!");};
- //执行func
- func();
- /////////////////////////////////auto的返回值占位符的实例//////////////////////////////////
- //应用于模板
- template <class T, class U>
- auto add(T t, U u)
- {
- auto v = t + u;
- <span style="white-space:pre"> </span>return v;
- }
代码中列举了一些auto的应用场景,可以用来初始化变量,可以用来消除冗长,可以应用于模板,在没有auto之前对于v的类型推断是非常麻烦的事情,而且容易出错,有了auto就相对容易了很多,模板函数的返回值也是用auto进行了站位。
好了,上面就是auto的基本使用方法,今天的课程。。。。。。。。当然还没完。上面讲了auto很多好用的地方,能帮我们简化我们的工作。大家是不是感觉自从有了auto,腰也不酸 了,腿也不疼了,一口气撸几十次也不眼冒金星了。哈哈,新特性的好处是显而易见的,但是随之而来的副作用也是多多的,例如在你使用auto的时候需要注意的问题。
哈哈,有得必有失,让我们耐心的看一下使用auto需要注意的事项,还是以代码来讲解,代码如下:
1,auto修饰的变量必须初始化
- auto var; //错误,因为没有初始化
2,auto不能和其他类型修饰符联合使用(C++98或者C语音是允许这么做的)
- auto int var = 0; //错误
3,auto不能修饰模板和参数
- template< auto t> func(auto a){};//错误,auto不能修饰模板和参数
4,在堆上开辟的空间必须初始化
- int *a = new auto();//错误,未初始化
- int *b = new auto(3);//正确
- auto *c = new auto(4);//正确
- auto *d = new auto();//错误,未初始化
5,auto是一个占位符,并不是一种类型,所以不能用在对变量的强转
- int a = 44;
- auto b = (auto)a;//错误
- auto c = static_cast<auto>(a);//错误
6,定义一系列auto对象时,应该保持对象的类型相同
- auto a = 0,b = 1,c = 2;//正确
- auto d = 3,e = 4,f = 5.0;//错误
7,auto可以用 * ,& ,&&,const修饰
- auto a = 12;
- auto *p1 = &a;
- auto &p2 = a;
- const auto b = a;