C++排雷:13.const的各类用法总结

本文详细解析了C++中const限定符的使用,包括常量定义、常量引用及指针与const的关系。解释了顶层const和底层const的区别,以及如何使用const_cast去除const属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常量:const对变量加以限定-----顶层const

const int bufsize = 512;

这样就把bufsize定义成了一个常量。

  • 任何试图为bufsize赋值的行为都将引发错误:
bufsize = 512;    //错误:试图向const对象写值

因为const对象一旦创建其值就不能再改变,所以const对象必须初始化。

  • const对象初始化的方法:
const int i = get_size();
const int j = 42;
int k=52;
const int ci = k

2、常量引用:对常量的引用(对const的引用)----底层const常量的引用不能用作修改它所绑定的对象:

const int ci = 1024;
const int & r1 = ci;   //正确:引用及其对应的对象都是常量
r1 = 42;   //错误:r1是对常量的引用
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量对象

虽然,这种操作形式对引用可参与的操作做出了限定
但是,对于引用的对象本身是不是一个常量未做限定:

int i =42; 
int &r1 = i; //引用r1绑定对象i
const  int &r2 = i;  // 引用r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0; // i 的值修改为0
r2 = 0; // 错误:r2 是一个常量引用

3、指针和const

3.1 指向常量的指针:不能用于改变其所指对象的值-----底层const:指针所指的对象是一个常量

const double pi  = 3.14 ;
const double *ptr = π

3.2 常量指针:必须初始化 -----顶层cosnt:指针本身是个常量

int  errNumb = 0 ;
int * const curErr = &errNumb;//curErr将一直指向errNumb

3.3 顶层const 和底层const的区别:

普通变量没有底层顶层的区别

int const a == const int a

只有对应指针,引用才会有区别:

  • 底层说白话就是不允许你对目标值进行修改
  • 顶层就是不允许你修改你的目标。

3.3.1底层const

非常量底层const

  • 可以赋值给常量底层const;

常量底层cosnt

  • 不能赋值给非常量底层const。

举例:

const int* b = &a;//

核心就是这是个指向常量的指针,*b被"const"住了,不能改!

  • a可以通过a = x来改变,但不可以通过*b = x来更改。
  • 可以将b指向别的地址,变量。例如声明int c =2;b = c。

3.3.2顶层const

非常量顶层const

  • 可以赋值给 常量顶层const;

常量顶层cosnt

  • 不能赋值给非常量顶层const。

举例:

int * const b = &a;

核心就是这是个指针常量(顶层,先是常量后是指针),b被"const"住了,不能改!

  • a既可以通过a = x来改变,也可以通过*b = x来改变
  • 但不可以把b指向别的地址、别的变量。例如声明 int c = 2;b=c即会报错

注意:const_cast只是C++的一种无奈之举,详情见const_cast内含

  • 当存在某个指向常量的指针(底层cosnt,不允许通过该指针改变其指向的内容),我们需要改变其指向的内容,但缺无法直接获取该变量
  • 这时候使用const_cast可以去掉上述指针的const属性,并将其中地址赋予新指针,这个新指针就可以去更改内容。

参考文献1
参考文献2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值