顾名思义,const修饰的意思是不能直接改变的值。

  在C++的编码过程当中很多地方可以用到。

  1、许多对象初始化之后,其值不用再改变

  2、符号常量,使代码可以更加容易维护

  3、某些指针只是获取所指的对象的值,而不能改变其所指对象的值

  4、防止函数调用过程当中对所传递参数的修改

  用const修饰的对象,有以下需要牢记的特性:

  1、定义的时候必须初始化,后续不能再改变其值

  2、如果一个const用另一个constant表达式初始化,则在编译的时候对其求值,同时不会分配存储空间,

  也是不能作为左值(其地址可以获取的某个对象)进行使用

  对于引用,指的是对象的一个别名。引用在定义的时候必须初始化,绑定到一个对象当中。

  主要用在函数参数和函数返回类型当中。当const和引用结合起来使用的时候,要注意一些特性的区分,

  下面通过例子进行简单说明。

// 注意区分指针和隐用
int val = 2012;
int& valr = val; // ok
int& valr1 = &val; // error
int* p = &val;
int*& valr2 = &p; // ok,valr2是int*类型的引用


// 注意区分一般引用和常引用,const T&和T&
int val = 2012;
int& valr = val; // ok
const int& valr1 = val; // ok
int& valr = 2012; // error,一般引用T&的初始化表达式必须是左值,2012不是左值,所以不行
const int& valr1 = 2012; // ok,这里通过int temp = int(2012);构建一个temp,然后再通过temp初始化const int&,这个temp一直存在,直到程序块结束


// 常引用的另一个例子
int val = 2012;
int& valr = val+1; // error,同样val+1不是一个左值,所以不能用来初始化int&
const int& valr1 = val+1; // ok,也是通过中间的临时变量处理
// 常引用结合指针的使用
int val = 2012;
int*& valr = &val; // error,因为&val不是一个左值,&val获取的是一个地址,不能进行&val++之类的操作
int* const& valr = &val; // ok,const T&没有上面这种限制了,&val构建中间变量,然后再初始化,注意const不能放在*之前,否则是修饰指针所指的对象了

const int var = 2012;
int*& varr = &var; // error,显然的
int* const& varr = &var; // error,因为var是const int类型的
const int* const& varr = &var; // ok,满足要求

// 对于不是const&
const int* p = &var;
const int*& varr = p; // ok,此时不需要const&,因为p是左值
// 用一个const初始化另一个const&
// 前面提到某些const变量会在编译的时候求值,不会分配存储空间,所以不能当作左值来处理
const int val = 2012; // val不分配存储空间
int& valr = val; // error,val不能做左值
const int& valr = val; // ok,也是通过中间变量处理

// 对于指针的结合使用
const int val = 2012;
const int* p = &val;
const int* &pr = p; // ok,p是左值
const int* const& pr1 = &val; // ok,通过中间变量初始化
int* const& pr2 = &val; // error,引用的类型不符合,一个是const int*,另一个是int*

// const&初始化的类型转换
int val = 2012;
const double& valr = val;
double dval = 3.14159;
const int& valr = dval; // ok,temp构建的时候,类型转换int temp = int(dval);
const int& valr1 = 3.14159; // ok,temp构建的时候,类型转换int temp = int(3.14159);
int& valr2 = dval; // error,没有temp进行中间的类型转换
int& valr3 = 3.14159; // error,类似,没有中间变量进行类型转换