C++ auto

1.auto
  *C++11将其用于实现自动类型推断(这要求显式初始化,让编译器将变量类型设置为初始值的类型)
 
 void fun(int x)
{
cout<<"int fun(int x): "<<endl<<x<<endl;
}

 int main()
 {
 
    auto x=1;
    auto px=&x;
    
    auto pf=fun;
//等效于void (*pf)(int);pf=fun; 
    cout<<x<<endl;
    cout<<*px<<endl;
    (*pf)(2);       
   
    return 0;
 }



output:


int fun(int x):
2



 应用于STL可以简化模板声明
 int main()
 {
 
  vector<int> vec{1,2,3,4,5} ;
for(auto p=vec.begin();p!=vec.end();p++)
//auto p=vec.begin()等效于vector<int>::iterator p=vec.begin();
 {
 cout<<*p<<ends;//1 2 3 4 5
 }   
return 0;
 }




2.decltype
   *将变量的类型声明为表达式指定的类型
    格式:
      decltype{expr} var;
  Example:
   int main()
{
  decltype(1+1.111) x;
//x为double类型 
  x=3.14;
  cout<<x<<endl;
//3.14
 
  return 0;



  decltype应用于模板
  Example:
   template<class T1,class T2>
 void add(T1 v1,T2 v2)
 {
  decltype(v1*v2) res;
//res的类型将根据v1,v2的类型而推断
 res=v1+v2;
 cout<<res<<endl;
 }
 
int main()
{
  add(1,3.14);//4.14
 
  return 0;



3.返回类型后置
  *在函数名和参数列表后面指定返回类型
  *auto返回值占位,与decltype配合使用,用于返回值类型后置时的占位。
 
  Example:
  template<class T1,class T2>
  auto add(T1 v1,T2 v2)->decltype(v1*v2)
  {
      return v1+v2;
   }
 
int main()
{
  cout<<add(1,3.14);
//4.14
 
  return 0;

 
  
4.模板别名:using=
  Example:
  int main()
{
vector<int> vec{1,2,3};
using it_type = vector<int>::iterator;
for(it_type it = vec.begin();it!=vec.end();it++)
{
cout<<*it<<ends;
//1 2 3
}
  
    return 0;





 *using= 与typedef的区别
  using=可用于模板部分具体化,而typdef不能

template<class U,class V>

 class A
 {
  public:
   A(U i,V j):x(i),y(j)
   {
   }
   void fun()
  {
  cout<<"x: "<<x<<endl;
  cout<<"y: "<<y<<endl;
  }
private:
  U x;
  V y;
 };


template<class T>
  using u_A=A<T,int>;
  
int main()
{
   
  
  u_A<string> a("hello",100);
  a.fun();
  
   return 0;



output:
 x: hello
 y: 100






5.nullptr空指针
  *nullptr是指针类型,不能转换为整型
  *nullptr==0为true(C++11仍然允许使用0表示空指针
  int main()
{
  int *p=nullptr;
  cout<<(p==0)<<endl;//1
  
  return 0;




你可能感兴趣的:(C++ auto)