C++11 auto

编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而要做到这一点并非那么容易,有时根本做不到。


c++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属类型。


例如:

int a=3,b=2;

auto s=a+b;

因为两个变量类型是int ,所以 s的类型也就是int。


[cpp]   view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     string s("some string");  
  8.     for(auto c:s)        //for循环把变量c和s联系起来,通过使用auto,c的类型为char,每次迭代,s的下一个字符被拷贝给c,  
  9.         cout<<c<<endl;  //因此循环可以读作“对于字符串是s中的每个字符c”  
  10.     system("pause");  
  11.     return 0;  
  12. }  



[cpp]   view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     string s("some string");  
  8.     for(auto &c:s)          
  9.         c=toupper(c);//c是一个引用,因此赋值语句将改变s中的字符  
  10.     cout<<s<<endl;  
  11.     system("pause");  
  12.     return 0;  
  13. }  


 

 

 

总的来说auto关键字主要有两个用处,第一个就是自动类型推断,第二个是返回值占位符。废话不多说,先来看一段代码:

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ///////////////////////////////////auto的自动类型推断实例///////////////////////////////////  
  2.     //使用auto初始化变量  
  3.     auto a = 10;  
  4.     printf("a = %d",a);  
  5.     auto b("auto");  
  6.     printf("b = %s",b);  
  7.     //使用auto消除冗长  
  8.     map<string,vector<int> > _map;  
  9.     map<string, vector<int> >::const_iterator itr1 = _map.begin();  
  10.     auto itr2 = _map.begin();  
  11.     //使用auto声明lambda表达式  
  12.     auto func = [](){printf("auto!!!");};  
  13.     //执行func  
  14.     func();  
  15.     /////////////////////////////////auto的返回值占位符的实例//////////////////////////////////  
  16.     //应用于模板  
  17.     template <class T, class U>  
  18.     auto add(T t, U u)  
  19.     {  
  20.         auto v = t + u;  

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span>return v;  
  2.     }  


代码中列举了一些auto的应用场景,可以用来初始化变量,可以用来消除冗长,可以应用于模板,在没有auto之前对于v的类型推断是非常麻烦的事情,而且容易出错,有了auto就相对容易了很多,模板函数的返回值也是用auto进行了站位。

好了,上面就是auto的基本使用方法,今天的课程。。。。。。。。当然还没完。上面讲了auto很多好用的地方,能帮我们简化我们的工作。大家是不是感觉自从有了auto,腰也不酸 了,腿也不疼了,一口气撸几十次也不眼冒金星了。哈哈,新特性的好处是显而易见的,但是随之而来的副作用也是多多的,例如在你使用auto的时候需要注意的问题。

哈哈,有得必有失,让我们耐心的看一下使用auto需要注意的事项,还是以代码来讲解,代码如下:

1,auto修饰的变量必须初始化

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. auto var; //错误,因为没有初始化  


2,auto不能和其他类型修饰符联合使用(C++98或者C语音是允许这么做的)

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. auto int var = 0; //错误  


3,auto不能修饰模板和参数

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. template< auto t> func(auto a){};//错误,auto不能修饰模板和参数  


4,在堆上开辟的空间必须初始化

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int *a = new auto();//错误,未初始化  
  2.     int *b = new auto(3);//正确  
  3.     auto *c = new auto(4);//正确  
  4.     auto *d = new auto();//错误,未初始化  


5,auto是一个占位符,并不是一种类型,所以不能用在对变量的强转

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int a = 44;  
  2. auto b = (auto)a;//错误  
  3. auto c = static_cast<auto>(a);//错误  


6,定义一系列auto对象时,应该保持对象的类型相同

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. auto a = 0,b = 1,c = 2;//正确  
  2. auto d = 3,e = 4,f = 5.0;//错误  


7,auto可以用 * ,& ,&&,const修饰

 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. auto a = 12;  
  2. auto *p1 = &a;  
  3. auto &p2 = a;  
  4. const auto b = a;  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值