c++11特性学习,长期更新
适应改变,学会改变,编程更加高效
1.constexpr常量表达式与const
1)const意在给系统和使用者说明,声明的变量其值不变,或者说其函数体内不修改其余对象的特性,即常量特性修饰
2)constexpr:全写为const expression 即常量表达式,主要用于修饰表达式,修饰如 constexpr int a=3;无特殊意义,用于给编译器说明,给表达式结果是一个常量值,用constexpr修饰某物并不保证它一定在编译时被计算,也可以在运行时被计算。
2.auto-新特性
1) C++98:自动变量说明,类似与inline对函数的修饰,register对于变量的修饰,用于告诉编译器被修饰对象的特效。自动变量声明:该变量拥有自动生命周期,在其有效域结束时回收;
2)C++11:删除c++98的自动变量说明,赋予新特性,其用于“自动根据初始化数值,赋予变量类型说明,省去在函数编程时类型说明混淆,难以分清的情况”,该特性要求,auto修饰的变量,
在声明时必须给予定于(予参照以便决定变量类型),其跟程序猿自己写出适合类型时无太大区别,可以省去较长的变量类型说明(特别是函数模版器使用迭代器时),但一般情况下使用(基本类型)可读性较差。
3)auto忽略顶层const特性,即auto的赋值,不会加上const特性(如果加上const特性,那么不符合逻辑,他不能知道定义的下文,被修饰变量会不会产生改变),若要增加const说明,则需要显式定义
const int a=4;
auto b=a; //b为int
auto c=&a; //c被解析为const int * ,逻辑上解释为a为常量,c获取常量地址作为auto初始化,c必须为const
PS:顶层const :其定义为相对概念,一般指的是从左到右,双const修饰时,左边的const,即const int *p=a; 和 int const *p=a;俩种写法等价,意为:“p为指向整型常量的指针”
底层const:对应顶层const,一般位于双const修饰右者, int *const p=a 意为:“p为常量,其为整型指针”
对于难于看清类型的情况,从右向左的读词方式有奇效,const int * const p=a; 意为:"p为常量,其值不能改变,p的值为const int *,即整型常量地址"
3.using-别名特性
除传统的typedef别名说明外,增加using 别名声明类型
typedef double w,*L; w为double的别名声明,L为double别名
using lf=w; lf为w的别名声明,即double
特别的,别名特性如果加上const限定时,不能简单 的将别名的原来定义代入进去
如 w a=3.14;
const L p=a;
不等于 const double * p=a; 解读结果变成 p为“指向double常量的指针” 这种类似栈的解读代入(即递归解读L未知,解析L,返回解析结果,代入)
正确解读姿势为:由表层至里, P为const L的常量----->L未知,L为double指针------>P为常量,double*的类型的常量
原文:https://www.cnblogs.com/jing19960917/p/10745911.html