const 限定符,定义的值不可以被修改。所以必须进行初始化。
1.必须进行初始化。
const int i = 3;//编译时初始化
const int i = GetSize();//运行时初始化
2.初始化完成后,任意给const变量进行赋值的操作都将引发错误。
const int i = 3;//编译时初始化
i= 5;//错误
3.默认状态下,const对象仅在文件内有效,多文件共享可使用extern
const的引用
1.引用及其对应的对象都是常量
const int c = 1024;
const int &r = c; //正确
2.引用的对象可以是普通对象
int c = 1024;
const int &r = c;//正确
//注意:普通非常量引用不能绑定常量
const int c = 1024;
int &r = c;//错误
const 的指针(参考c++ primer)
注:感觉与网上很多博客理解的不太一样,希望各位大佬多多指正。
指针常量 - 指向常量的指针,不能用于改变其所指对象的值
const double pi = 3.14;
const double *cptr = π//正确
*cptr = 20;//错误,所指对象的值不能改变
double dval = 3.14;
cptr = &dval;//正确,运行指向常量的指针,指向一个非常量对象
const double pay[3] = {1.11,2.22,3.33}; // const double 的数组,这意味着数组中的每个元素都是 一个 const double,编译器不会允许程序员编写改变数组内容的代码
常量指针 必须初始化,初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。
把*放在const关键字钱,说明指针就是一个常量。
int errNum = 0;
int *const curErr = &errNum;
*curErr = 0;//正确,将指针指向的对象重置
顶层const和底层const
顶层const 表示指针本身是个常量,更一般的,可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型、类、指针等。
底层const 表示指向的对象是一个常量,与指针和引用等复合类型的基本类型部分有关。比较特殊的是,指针类型既可以是顶层const也可以是底层const。
int i = 0;
int *const p1 = &i; //不能改变p1的值,顶层const
const int ci = 42; //不能改变ci的值,顶层const
const int *p2 = &ci; //运行修改p2的值,底层const
const int *const p3 = p2; //右是顶层,左是底层
const int &r = ci; //声明引用都是底层
注意:执行对象拷贝操作时,顶层const基本不受影响,但是底层const在拷入与拷出时必须具备相同的底层const资格或者两个对象的数据类型必须能够转换。
一般来说,非常量可以转化为常量。