const限定符
存在问题:
常用一个变量表示缓冲区的大小
变量可以适当的调整空间大小
但是警惕程序改变大小const的引入: 固定大小
注意:
const对象必须初始化
const int i = get_size(); //√ 运行时初始化
const int bufSize = 512; // √ 编译时初始化
const int k; //×
const 与 初始化
曲线救国
const的值是不能被修改的
但是,可以把const变量拷贝出来,给新的对象,这样就可以修改新的对象的值来达到修改数据值目的
const的变量值依旧不变如果利用一个对象去初始化另一个对象,他们是不是const都无关紧要
int i = 42;
int const ci = i; // unconst->const
int j = ci; //const->unconst
j = 1024;
const 与extern const
const的有效状态
默认状态下,const对象仅在文件内有
在一个文件中, const变量在编译过程中,编译器会把所有的const变量 用 初始化的值代替
extern 关键字
为了在多个文件中 使得const 变量都有效
所以会使用extern关键字
extern const int burSize = 512;
tips:
这种定义一般都是在头文件中
然后其他文件引入该头文件
const的引用 (reference to const)⭐
对const的引用 :把引用绑定到const对象上
special: 对cons的引用,不能用于修改他所绑定的对象
除了两个例外之外,引用类型 必须与 所引用对象的类型一致
int i = 42;
const int &ri = i;
const int j = 50;
//× int &rj = j;
const int k = 60;
const int &rk = k;
总结:
const变量可以引用非const变量,
非const变量不能引用const变量
const变量可以引用const变量
int i = 42;
int &ri = i;
const int &ri2 = i;
int const &ri3 = i;
// 这两个写法是等同的,表示a是一个int常量
ri,ri2,ri2,在这种情况下,ri2和ri3不可以被修改,ri可以被修改
但是ri被修改后,会影响绑定的ri2和ri3
const int和 int const 对于常量而言,写法是相同的,对于指针而言不同
⭐
const引用的两个例外之一:⭐
1. 初始化引用:可以用任意表达式作为初始值,只要该表达式能转化成该类型
double dval = 3.14;
const int &ri = dval;
具体过程: 3.14从double转化为了int型并存入了temp
double dval = 3.14;
const int temp = dval; ⭐
const int &ri = temp;
temp就是临时量 temporary
指针和const ⭐
const引用的两个例外之二:
允许指向常量的指针,指向非常量对象
double dval = 3.14;
const double *dp = &dval;
pointer to const and const pointer ⭐
指向常量的指针(pointer to const)
const int targetc = 5;
const int *ptri = &targetc;
int target = 6;
const int *ptri2 = ⌖
//× const double *ptrd = &targetc;
//× int *ptr2 = &targetc;
指针可以指向常量值,也可以指向非常量值
指向常量值的 指针(pointer to const):不能用于修改所指对象的值
(无论所指对象是否是const)
而常量对象的地址,只能使用指向常量的指针
总结:
const -> x 或者 -> const x
*const指针
引用不是对象,而指针是对象
所以const除了可以修饰 指针所指对象外(pointer to const),也可以修饰修饰指针自己(const pointer)
const pointer : 确定指向,但是不影响所指对象数据变化
int target = 1024,target2 = 256;
int *const pi = ⌖
target = 2048; //√
//× pi = &target2;
顶层const和底层const
顶层const(top-level const)锁方向
底层const(low-level const)锁数据
注意 : 当进行拷贝操作时,top-level const不受影响,但是low-level const影响较大
**`当拷贝时候,拷入和拷出的对象都必须具有const资格,或者两个对象的数据类型能转换成一致,(非常量x 转化为 常量const x)
int i = 0;
const int ci = 2;
const int &c_ri = i;
const int &c_ri_c = ci; //用于声明的const,low-level const
int &ri = i;
//x int &ri_c = ci;