本文整理了C++ Primer中对const的使用。
1.const对象一旦创建后其值就不能改变,所以const对象必须初始化。
1 const int i = get_size(); //正确 2 const int j = 42; //正确 3 const int k; //错误,k没有初始化
2.用来给const初始化的值是不是const类型都无关紧要。
1 int i = 42; 2 const int ci = i; //用非const初始化const,正确 3 int j = ci; //const给非const赋值,正确
3.默认状态下,const对象仅在文件内有效
const是编译器在编译过程中,把用到该变量的地方替换成相对应的值。为了实现这个替换,编译器必须知道const变量的初始值。
如果程序包含多个文件,则每个用了const对象都必须能访问到它的初始值才行。为了做到这一点,就必须在每一个用到该变量的文件中都有对它的定义。
为了支持这一用法,同时避免对同一变量的重复定义,默认情况下const对象只在文件内有效,多个文件内出现了同名const对象时,知识不同文件中分别定义了独立的变量。
如果需要在文件内共享,那么使用extern关键字。
1 //file.cpp 2 extern const int i = 3; 3 4 //file.h 5 extern const int i;
在cpp文件内定义并且初始化了const的i,而头文件中知识对它声明,指明i并非是本文件独有,它的定义将在别处出现。
4.const的引用(常量引用)
(1)常量引用可以绑定常量,也可以绑定非常量。
1 int i = 10; 2 const int j = 20; 3 const int &ii = i; //常量引用可以绑定一个普通变量 4 const int &jj = j; //常量引用可以绑定一个常量对象
当绑定一个普通变量时,不允许通过常量引用去修改变量的值,但是变量本身的值可以通过赋值、非常量引用等方式修改。如:
1 int i =42; 2 int &j = i; //可以通过修改j来修改i 3 const int &k = i; //不能通过修改k来修改i 4 i = 24; //可以通过直接赋值修改i
(2)非常量引用不可以绑定一个常量对象
1 const int i= 10; 2 int &ii = i; //错误,i是const,不可以被修改,而ii是非常量引用,不允许通过ii去修改i
5.指针和const
顶层const:表示指针本身是个常量。
底层const:表示指针所指对象是个常量。
例如:
1 int i = 0; 2 int *const p = &i; //顶层const,指针本身是常量 3 const int *p = &i; //底层const,指针所指的变量是常量
声明引用的都是底层const
1 const int &j = i; //底层const
注意:当进行拷贝操作时,可以忽略顶层const,但是不可以忽略底层const!也就是说,拷贝的双方若有一个是底层const修饰,那么另外一个也必须有底层const修饰才可以。
例如:
1 const int *p = &i; //底层const 2 int *pp = p; //错误行为,pp并没有底层const