笔记07:C++中的const

本文深入探讨了C++中const限定符的使用,包括如何将变量声明为常量,const引用和指针的特性,以及如何通过constexpr声明常量表达式。文章详细解释了const对象的初始化、作用域、引用绑定规则,以及const与指针结合的用法。

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

1,const 限定符

const int i = 0;,使用const可以将i变成一个常量,当试图对i的值进行修改时,会引发报错,需要注意的是,必须对const对象进行初始化,当然,初始化的值可以是任意复杂的表达式。也可以用一个对象去初始化另一个对象,它们是不是const都无关紧要,因为一旦拷贝完成,新的对象和原来的对象就没有任何关系了。

在默认状态下,const对象仅在文件内有效,当多个文件中出现同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。如果想要在多个文件中共享const对象,必须在变量的定义之前添加extern,如extern const i = 0;


2,const的引用

2.1,可以把引用绑定到const对象上,称之为对常量的引用,与普通引用不同的是,对常量的引用不能被用来修改它说绑定的的对象:

const int i = 2;
const int &j = i;  //常量引用
j = 3;    //error,对常量的引用不能修改。
int &k = i;    //error,试图让一个非常量引用指向一个常量对象。

2.2,当一个常量引用被绑定到另外一种类型上时:

double i  = 1.55;
const int &j = i;

当引用对象与被引用对象类型不一致时,编译器会产生一个临时量

const int temp = i;         //由双精度浮点数生成一个临时的整型常量
const int &j = temp;    //让j绑定这个临时量

2.3,当然,我们必须认识到,常量引用仅对可参与的操作做出来限定,对引用的对象本身是不是常量未作限定,因为对象也可能是个非常量,所以C++允许通过其他途径改变它的值:

int i  = 3;
int &j = i;
const int &k = i;
j = 0;

>>>  i = 0 , j = 0 , k = 0

可以看到const引用的k发生了变化,并不是3,而是0。


3,指针和const

与引用一样,指向常量的指针,不能用于改变其所指对象的值,即要想存放常量的指针,只能使用指向常量的指针:

const double pi = 3.14;
double *ptr = π   //ptr是一个普通指针,必须用常量指针指向常量。
const double *cptr = π    //正确
*cptr = 42;  //error,不能给*cptr赋值

所谓指向常量的 指针或引用,不过是指针或引用“自以为是”罢了,它们觉得 自己指向了常量,所以自觉地不去改变所指对象的指,其实可以使用别的方式来改变。

int i = 0;
int *const j = &i;  // j将一种指向i,即不变的是指针本身,而非指向的那个值

const double pi = 3.14;
const double *const pip = π //pip是一个指向常量对象的常量指针

4,constexpr变量

在复杂系统中,很难分辨一个初始值到底是不是常量表达式。就像const int sz = get_size();,sz就不是一个常量表达式,因为get_size()的具体值只有在运行时才能得到。所以在C++11中,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化

constexpr int mf  = 20;  //20是常量表达式
constexpr int limit = mf +1;  //mf+1是常量表达式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值