1. 基本简介
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
2. 修饰变量
2.1 修饰普通类型的变量
<span style="font-size: 16px;"><span class="kwd">const</span> <span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span> <span class="lit">7</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span> <span class="com">// 正确</span><span class="pln"> a </span><span class="pun">=</span> <span class="lit">8</span><span class="pun">;</span> <span class="com">// 错误,不能改变</span></span>
对于 const 变量 a,我们取变量的地址并转换赋值给 指向 int 的指针,然后利用 *p = 8; 重新对变量 a 地址内的值赋值,然后输出查看 a 的值。
从下面的调试窗口看到 a 的值被改变为 8,但是输出的结果仍然是 7。
如果不想让编译器察觉到上面到对 const 的操作,我们可以在 const 前面加上 volatile 关键字。
Volatile 关键字跟 const 对应相反,是易变的,容易改变的意思。所以不会被编译器优化,编译器也就不会改变对 a 变量的操作。
2.2 修饰指针变量
修饰指针变量有以下三种情况:
- A: const 修饰指针指向的内容,则内容为不可变量。
<span style="font-size: 16px;"><span class="kwd">const</span> <span class="kwd">int</span> <span class="pun">*</span><span class="pln">p </span><span class="pun">=</span> <span class="lit">8</span><span class="pun">;</span></span>
则指针指向的内容 8 不可改变。简称左定值,因为 const 位于 * 号的左边
- B: const 修饰指针,则指针为不可变量。
<span style="font-size: 16px;"><span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span> <span class="lit">8</span><span class="pun">;</span> <span class="kwd">int</span><span class="pun">*</span> <span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span> <span class="pun">&</span><span class="pln">a</span><span class="pun">;</span> <span class="pun">*</span><span class="pln">p </span><span class="pun">=</span> <span class="lit">9</span><span class="pun">;</span> <span class="com">// 正确</span> <span class="kwd">int</span><span class="pln"> b </span><span class="pun">=</span> <span class="lit">7</span><span class="pun">;</span><span class="pln"> p </span><span class="pun">=</span> <span class="pun">&</span><span class="pln">b</span><span class="pun">;</span> <span class="com">// 错误</span></span>
对于 const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。简称,右定向。因为 const 位于 * 号的右边
- C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量
<span style="font-size: 16px;"><span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span> <span class="lit">8</span><span class="pun">;</span> <span class="kwd">const</span> <span class="kwd">int</span> <span class="pun">*</span> <span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span> <span class="pun">&</span><span class="pln">a</span><span class="pun">;</span></span>
const p 的指向的内容和指向的内存地址都已固定,不可改变
2.3 修饰类成员函数