1 基本用法
const的出现是开始时为了警惕程序不小心改变了某个值,用const进行限定。
因为const对象一旦创建后其值不能再改变,所以const对象必须初始化。
const int i = size(); // right
const int ii = 10; // right
const int j; // wrong
const变量的常量特征只在对该变量改变时才会发生作用,若用其对其他变量进行赋值是被允许的。
int i = 4;
const int ci = i;
int b = ci; //right
初始化时若定义const
const int a = 10;
则在之后所有编译过程中把用到该变量的地方都替换成对应的值。若在多文件中想要使用const类型的值,就需要用到extern关键字。例如:
// dev.cpp中定义并初始化
extern const int MyAge=10; //全局
//dev.h
extern const int MyAge;
//main.cpp
#include<stdio.h>
#include "dev.h"
int main()
{
printf("%d\n",MyAge);
return 0;
}
2 初始化和对const的引用
引用
int i = 2;
const int &r1 = i; // 允许将const int&绑定到一个普通的int对象上
const int &r2 = 22; //right r2是一个常量引用
int &r3 = 22; //wrong
int &r4 = r1 *2; // r4是一个非常量引用
常量引用是发生了什么呢?如:
double dval = 3.14;
const int &ri= dval;
编译时编译器会处理成下面的形式:
const int temp = dval;
const int &ri = temp;
需要注意引用常量后,同样对该数也不能进行修改。例:
const int &r2 = i;
r2 = 0;//wrong
3 指针和const
谨记类型相同
const double pi = 3.14;
double *ptr = π //类型不统一
const double *cptr = π //right
*cptr = 12; //wrong
double dval = 3.14;
cptr = &dval;//right 但依然不能改变dval的值,因为cptr是const的 但是cptr可以改变
4 顶层const
首先需要说明:指针本身是不是常量以及指针所指是不是常量是两个相互独立的问题
用名词顶层表示指针本身是个常量
用名词底层表示所指对象是个常量
int i = 0;
int *const p1 = &i;//顶层const 不能改变p1的值
const int ci = 11;
const int *p2 = &i;//底层const 可以改变p2的值
const int *const p3 = p2;//顶层加底层
5 constexpr和常量表达式
常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式,例如:
const int max = 20;
const int a = max +10;
在C++11中,允许将变量申明为constexpr类型后由编译器来验证变量的值是否是一个常量表达式。