欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

const限定符解析

程序员文章站 2022-07-09 21:46:43
...
  • const
  1. const对象一旦创建后就不能再改变,所以const对象必须初始化
const int i = get_size(); //运行时初始化
const int j = 10; // 编译时初始化
  1. 编译器在编译过程将该变量都替换成常量
  2. const引用,

允许常量引用

const int ci = 10;
const int &r1 = ci; 
r1 = 42; //无法通过对常量的引用修改其对象
int &r2 = ci; // 非常量引用无法指向常量引用

非常量引用不能指向常量对象


常量引用 可以 绑定非常量的对象

int i = 42; // 1.
const int &r1 = i; // 2.允许用非常量来初始化
const int &r2 = 10; //常量初始化
const int &r2 = r1 * 2; //常量初始化

第1行和2行编译器转化为

const int i = 42; 
const int &r1 = i;

同理,常量引用绑定不同类型的非常量,编译器创建了一个临时量.

double i = 10;  // 编译器转化为 const int temp = i;
const int &r1 = i; // 转化为 const int &r1 = temp;

  • ri非常量引用,int &ri = i;,此时ri绑定的对象是编译器产生的临时量,相当于int &ri = temp.此时引用只能改变temp的值,而改变不了i的值.
  • 所以 引用类型必须与引用对象的类型一致

常量指针指向常量的指针

  1. 指向常量的指针
  • 想要存放常量的地址.只能使用指向常量的指针
const double pi = 3.14; // double型常量
double *ptr = π //普通指针无法存常量地址
const double *cptr = π //合法
*cptr = 42; //只能初始化,不能赋值
  • 可以给该指针赋值一个非常量,和上面的引用绑定非常量对象一样
double dval = 3.14;
cptr = &dval; //赋值
  1. 常量指针
  • 指针本身定义为常量,必须初始化(常量必须初始化),
  • 指针本身是常量意味着存放的地址不能够被改变,而不是指向对象不能被改变
int errNumb = 0;
int* const curErr = &errNumb; //初始化
const double pi = 3.14;
const double* const pip = pi; // pip是指向常量的常量指针
  • 指向常量的常量指针意味着不仅指针存放的地址不能够被改变,而且指向的对象是常量,也不能够被改变
  • 如果分不清符号声明,从右往左读,const离curErr近说明curErr本身是个常量对象

顶层const

  1. 顶层const:指针本身是一个常量.
  2. 底层const:指针所指向的对象是一个常量
int i=0;
int *const p1 = &i; //顶层const
const int ci = 42; //顶层const
const int* p2 = &ci; //底层const
const int* const p3 = p2; //
const int &r = ci; //底层const
  • 执行拷贝操作2个对象都必须具有相同底层const 资格
int *p = p3; //常量不能转化成非常量
p2 = p3; //都有底层const
p2 = &i // 非常量可以辅助给常量
const int &r2 = i; //非常量转化成常量
相关标签: const

上一篇: Java后端笔记12

下一篇: c学习记录