const 定义常量变量
const int bufsize = 512; // const变量必须被初始化;
将变量定义成常量只需在定义前加关键词const。变量一旦被定义成常量,该变量被称为常量变量,变量值不能再被更改,所以变量在被定义时就必须被初始化。任何更改常量对象值的操作都是非法的,包括直接对对象的赋值操作和通过引用,指针对对象的间接赋值操作。编译器会在编译阶段将用到常量变量的地方都换做对应的值。
const 的引用(对常量的引用,常量引用)
首先我们先说一下引用。首先看一下引用的代码:
int ci1 = 1024; // 定义一个int型变量
int &r1 = ci1; // 在r1变量前加一个'&',声明r1是对ci的引用
代码中ci1是对象,r1就是对ci1的引用。引用相当于对被引用对象起了个别名,对引用的所有操作与对被引用对象直接操作是完全一样的。
r1 = 512; // 对r1的赋值相当于直接对ci赋值
// 跟如下代码是一样的
ci1 = 512;
原因是引用只是给对象起了个别名,相当于同一块内存空间,以前是叫ci1,现在又给它起了个名字叫r1,这样我们通过ci1和r1都可以访问到这块内存空间。
然后我们再看一下对常量的引用,代码如下:
const int ci2 = 1024; // 定义常量整型变量ci2
const int &r2 = ci2; // 定义对常量整型对象的引用r2
以上我们定义了一个常量整型变量ci2,又定义了对常量的引用r2。需要注意三点:
- 对常量的引用不能被用作修改它所绑定的对象
r2 = 512; // 错误:r2是对常量的引用,不能被用来修改ci2的值。
想一想如果我们能够对常量的引用赋值会如何?我们知道,对常量的引用赋值就相当于对被引用对象赋值,所以对r2的赋值相当于对ci2的赋值,而ci2是常量,它的值不能被修改,所以对常量的引用就会导致错误。
2. 非常量引用不能指向常量对象
int &r3 = ci2; //错误:r3是非常量引用,不能指向常量对象ci2
如果r3能够指向ci2会如何呢?假如r3能够指向ci,因为r3是对整型的引用,所以可以对r3赋值,而对r3的赋值相当于对常量变量ci2的赋值,这与常量对象值不能被修改矛盾。所以为了避免这种现象的发生,C++语法也就规定了不能用非常量引用指向一个常量对象。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
3. 常量引用可以指向非常量对象
int i = 1024;
const int &r4 = i; // 常量引用指向非常量对象
常量引用既可以指向常量对象,也可以指向非常量对象。不管是指向常量对象还是非常量对象,常量引用都不能更改被引用对象的值。
// 不能通过r4更改i的值,但i值可以被更改
int i = 42;
const int & r4 = i;
r4 = 20; // 错误:r4是对常量的引用,不能通过r4更改被引用对象的值
i = 20; //正确:i不是常量,可以被直接赋值
指向常量的指针&常量指针
对于引用,指向常量的引用和常量引用是一回事,但对于指针,指向常量的指针和常量指针是完全不同的两个概念。下面分别介绍。
指向常量的指针
指向常量的指针是指,一个指针指向了一个常量对象,该指针不是常量,因此指针的值(指针存放的地址)可以被改变,而指针所指向的对象是个常量,因此不能被修改。
// 指向常量的指针定义
const int ci2 = 1024; // 定义常量对象
const int *r5 = &ci2; // r5是指向常量的指针
指向常量的指针同样不能更改对象的值,但因为没规定指针是常量,因此指针的值可以被改变,即指针可以指向其他对象,指向其他对象后,同样不能用该指针更改新对象的值。
常量指针
int ci1 = 1024;
int *const r6 = &ci1; // r6是常量指针
常量指针是指指针本身是一个常量,即指针一旦指向某个对象后就将一直指向该对象,不能再指向其他对象,为什么呢?因为指针的值存放的是对象的地址,地址不能被修改,因此指针将一直指向一个对象。因为常量指针只规定了指针是常量,没说它所指向的对象是常量,因此可以通过该指针更改对象的值。
int ci3 = 512;
r6 = &ci3; // 错误:r6是常量指针,其值不能被修改
*r6 = ci3; // 正确:r6是常量指针,不是指向常量的指针,可以通过指针修改指向对象的值
指向常量的常量指针
将常量指针指向一个常量对象就是指向常量的常量指针,可以被定义如下:
const int ci2 = 1024;
const int *const r7 = &ci2;
指向常量的常量指针本身是常量,因此指针的值(指向对象的地址)不能被改变,又因为指向的对象是常量,因此不能通过指针更改对象的值。
总结
本文主要讲解了用const定义常量对象,对常量的引用以及指向常量的指针与常量指针等知识。值得注意的是,指向常量的指针和对常量的引用不能用来更改对象的值,但它们不能更改对象的值不表示对象的值不能通过其他方式更改,对象的值能不能更改取决于对象是不是常量。