一、const限定符
在我们定义变量的时候,常常有使变量的值固定不变的需求,由此引出了const关键字对变量加以限定。语法如下,我们定义一周七天不会改变。
const int week = 7;
由于const对象一旦创建后其值就不会再改变,所以const对象必须初始化。
const int week = 7; //正确:运行时初始化
const int month; //错误:month是一个未经初始化的变量
const还有一个特点是,在默认的情况下,const对象仅在文件内有效,当在多个文件中出现了同名的const对象时,其实就等于在不同文件中分别定义了独立的不同的变量。但有时候我们有只在一个文件中定义const,而在多个文件中声明并使用它的需求,这个时候我们的解决办法是,对于const变量不管是声明还是定义都添加extern关键字这样只需要一次定义即可,写法如下
//main.cpp定义并初始化一个常亮,该常亮能被其他文件访问
extern const int week = 7;
//main.h头文件
extern const int week;//与main.cpp中定义的week是同一个
extern在这里的作用是指明week并非本文件所独有,它的定义将在别处出现。
- const的具体用法之后还会出新的文章,这里浅浅挖个坑吧^_^
二、constexpr和常量表达式
首先我们介绍两个概念
- 常量表达式:常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。例如,字面值属于常量表达式,用常量表达式初始化的const对象也是常亮表达式,一个对象是不是常量表达式由它的数据类型和初始值共同决定。我们给出几个例子
const int max_file = 20; //是常量表达式
const int limit = max_file + 1; //是常量表达式
int staff = 27; //不是常量表达式,这里没有const限定
const int sz = get_size(); //不是常量表达式,这里的值运行时才能获取到,故不是
- constexper变量:我们通过上面常量表达式的概念学会了最基本的分辨的方法,但是在一些更为复杂的变量形式中,我们很难或者说几乎不可能分辨一个初始值到底是不是常量表达式。由此我们引出了constexper,在C++11中,允许我们将变量声明为constexper类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constper的变量一定是一个常量,而且必须用常量表达式初始化。
constexper int mf = 20; //20是常量表达式
constexper int mk = mf + 1; //mf + 1 是常量表达式
constexper int sz = size(); //只有当size是一个constexper函数时才是一条正确的声明语句
一般来说,如果你认定变量是一个常量表达式,那就把它声明为constexper类型。
三、auto类型说明符
在我们编程时常常需要把表达式的值赋值给变量,这就要求在声明变量的时候可以清楚的知道表达式的类型,然而做到这一点不容易,有时甚至根本做不到,由此C++11引出了auto类型说明符,使用它可以让编译器代替我们去分析表达式所属类型,auto让编译器通过初始值来判断变量的类型,显然,auto的定义的变量必须有初始值。
auto item = 317; //赋值317给item判断出item类型为int
使用auto也可以在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的基本数据类型都一样;
auto i = 0,*p = &i; //正确:i是整数,p是整形指针
auto r = 0,m = 3.14; //错误:r和m的类型不一样
四,decltype类型指示符
有时我们遇到这样的情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量,由此C++11中引入了decltype类型指示符,它的作用是选择并返回操作数的数据类型。语法如下:
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x的类型是const int
decltype(cj) y = x; //y的类型是const int&,y绑定到变量x
decltype(cj) z; //错误:z是一个引用,必须初始化