背景

我们想定义一种变量,它的值不能被改变。

1
const int bufSize = 512;

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

如何跨文件

file_1.cpp

1
extern const int bufSize = fcn();   // 定义并初始化

file_1.h

1
extern const int bufSize;   

如果想在多个文件间共享const对象,必须在变量的定义之前添加extern关键字。

const的引用

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

常量引用是对const的引用

const 指针

允许将指针本身定为常量即常量指针,常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。

1
2
3
4
int errNumb = 0;
int *const curErr = &errNumb; // curErr将一直指向errNumb
const double pi = 3.1415;
const double *const pip = π // pip是一个指向常量对象的常量指针

要想弄清楚这些声明的含义最行之有效的办法是从右往左阅读。

顶层const

因为指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。

用名词顶层 const表示指针本身是一个常量,而用名词底层 const表示指针指的对象是一个常量。

注:

1
2
const int *const p3 = p2;   // 靠右的是const是顶层const,靠左的是底层const
const int &r = ci; // 用于声明引用的const都是底层const