C++ Primer注解 - const限定符和指针

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;

图片.png

你可能感兴趣的:(const,c++,指针)