1.const对象必须初始化。初始值可以是任意复杂的表达式
const int k = geisize();
const int i = 98;
2.利用一个对象去初始化另一个对象,与是否是const类型无关
int i = 42;
const int ci = i;
int j = ci;
3.默认const对像仅在文件内有效(在一个文件中定义,其他文件使用)
//file1.cc定义且初始化
extern const int bufsize = fcn();
//file1.h头文件
extern const int bufsize ;
4.对常量的引用
1.
const int i = 99;
const int &p = i;//引用及其对象都是常量
int &q = i //错误
常量引用只能绑住常量(引用的类型必须和它所引用对象一致)
2.例外1:初始化常量引用只要表达式的结果能转换成引用的类型
int i = 43;
const int &r1 = i;
const int &r2 =43;
const int &r1 = r1 * 2;
C++创建了一个临时变量,例如:double dal = 3.14;
const int temp = dal;
const int &r1 = temp;
但是不能int &r2 = dal;因为把r2绑定到临时变量上没有意义)
3.可以对常量引用的值进行修改
int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0;
5.指向常量的指针
指针的类型必须与其所指的对象的类型一致
例外1:
指向常量的指针可以指向一个非常量:
double dal = 3.12;
const double *p =&dal;
6.常量指针(指针所本身不允许变,指针所指向的值可变)
int item = 0, item1 = 9;
int *const cur = item;
*cur = 99;//正确的
cur = item1//不正确
7.顶层const
顶层const:指针本身是常量
底层const:指针所指对象是常量
8.常量表达式:值不变,且编译过程就可以得到结果的表达式
1.constexpr变量一定是常量,且必须用常量初始化
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size();//只要size()是一个constexpr函数才是正确的
2.字面值:constexpr指针初始化必须是nulllptr或者0,或者存储在某个固定地址中的对象
限定符constexpr仅对指针有效,与指针对象无关(constexpr把它的对象置为顶层的const)
const int *p = nullptr; //p是一个指向常量的指针
constexpr int *q = nullptr;//q是一个常量指针
3.指针与const:定义在函数体外的对象的地址固定不变,可以用来初始化constexpr指针(有固定地址的变量可以初始化constexpr指针)
函数体外:int j = 0;
contexpr int i = 42;
函数体内:
constexpr const int *p = &i;
constexpr int *p1 = &j;
static int y = 0;
constexpr const int* m = &y;//有固定地址的变量可以初始化constexpr指针