auto的用法,可以根据变量值,推出变量类型,其中比较特殊的就是cosnt引用用法
int main()
{
const int a=10;
auto x=a;// x int
auto& y=a; //auto就是const int & 类型
}
错误用法:auto&y=a,u=a; //这个时候u就不能编译通过,必须是 auto& y=a,&u =a;
c++真的需要对内存,cpu,缓存应用非常到位。推荐书籍《深入了解计算机》第一章,第六章,第九章学习。
小结:如果使用auto&引用或者指针时就会继承变量的const或者v(易变)特性。
auto可以作为函数的形参 数组结构体不能使用auto
decltype关键字也可以用它来推演,与auto不同,auto所修饰的变量必须被初始化,编译器需要通过初始化来确定auto所代表的类型,即必须要定义变量。
可以使用表达式来推演函数类型。
const int & Add(int a,int b)
{
return a;
}
int main()
{
auto x=10; //x=int;
decltype(x) y; //y= int;
decltype(x+y) z;//int ;
decltype(Add(1,2)) c=x; // int &
}
//如果是使用指针
const int *Add(int a)
{
return &a;
}
decltype(Add(1)) c=&x;
所以可以获得变量类型,表达式类型还有函数返回值类型。
基于范围的for用法基于范围的for 写法:
for(ELemptype val:array)
{
...//statement
}
ElemType:是范围变量的数据类型。必须与数组(容器)元素的数据类型一样,或者是数组元素可以自动转换过来的类型。
val:是范围变量的名称。该变量将在循环迭代期间依次接收数组中的元素值。在第一次循环迭代期间,它接收的是第一个元素的值;在第二次循环迭代期间,它接收的是第二个元素的值;依次类推。
array:是要让该循环进行处理的数组(容器)的名称。该循环将对数组中的每个元素迭代一次。
statement 循环体内容 continue结束一次循环,break跳出整个大循环等都可以使用。
int main()
{
int ar[]={1,2,3,4,5,6,7};
for (int val:ar)
{
cout<
好处:不需要划定范围 坏处:不能跳着输出每个元素值
可以与引用结合 减少使用空间
struct Student
{ int s_age;
char s_addr[200];
}
int main()
{
struct Student studx[10]={};
for(const auto &x:studx)
{
}
}
auto与范围for与数组的结合:
void Print(auto &x) //可以推出数组的类型,大小
{
for(const auto& val:x) //推出数组元素类型
{
cout<< val<<" ";
}
cout <
}
int main()
{
char str[]={"yhping"};
int ar[]={1,2,3,4,5};
double dx[]{1.2,2.3,3.4,4.5,5.6};
Print(str);
Print(ar);
Print(dx);
}
注意:可千万不能这样写
int *p=ar;
for(int&x:p)
{
} //因为p是指针,并不是容器,for无法确定容器范围



