const满足定义一种变量在被设置初始值后它的值不能再次被改变。
在默认状态下,const对象仅在文件内有效。 如果需要在不同文件下共享需要添加关键字extern,这样只需要定义一次就够了。
extern const int bufSize;
1. const 的引用
把引用绑定到const上,和其他对象使用一样,最大的区别在于对常量的引用不能被用作他所修改的绑定对象:
const int ci=1024;
const int &rl=ci;
rl=42;
int &r2=ci;
ci不允许赋值,当然也不可能通过引用去改变ci;
- 初始化和对const的引用
引用类型必须与其所引用对象的类型一直,但是有两个例外: 1)一个是初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转化成引用的类型即可。
int i=42;
const int &rl=i;
const int &r2=42;
const int &r3=rl*2;
int &r4=rl*2;
int i=42;
int &rl=i;
const int &r2=i;
r1=0;
r2=0;
2、指针和const
- 与引用一样,也可以令指针指向常量或非常量。
- 类似与常量引用,指向常量的指针不能用于改变其所指对象的值。
- 和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。
所以,要想存放常量对象的地址,只能使用指向常量的指针:
const double pi=3.14;
double *ptr=π
const double *cptr=π
*cptr=42;
指针的类型必须与其所指对象类型一致,但是有两个例外: 1、允许令一个指向常量的指针指向一个非常量对象;
double dval=3.14;
cptr=&dval;
const 指针
- 常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能在改变了。
- 指针是一个常量时,可以通过指针修改其所指对象的值,这样做完全依赖于所指对象类型。
*pip=2.72;
if(*curErr)
{
errorHandler();
*curErr=0;
}
3、顶层 const
- 顶层 const (top-level const) 表示指针本身是个常量;
- 底层 const (low-level const) 表示指针所指的对象是一个常量;
4、constexpr 和常量表达式
- 常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。
显然,字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式。 - constexpr 变量 :在C++11 新标准规定,允许将变量声明为 constexpr 类型以便编译器来验证变量的值是否是一个常量表达式。
- 字面值类型:指简单易见的数据类型,比如:算术类型、引用和指针等。
- 指针和 constexpr :必须申明,在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,对指针所指的对象无关:
const int *p=nullptr;
constexpr int *q=nullptr;
与其他常量指针类似,constexpr 指针既可以指向常量也可以指向一个非常量。
|