const限定符
2016-08-02 本文已影响56人
b64c74899092
const限定符
const对象一旦创建就不可以改变,所以必须初始化,可以用复杂的表达式或者常量来初始化。
例:
const int a=1; // 正确,编译时初始化
const int b=get_size(); // 正确,运行时初始化
const int c; // 错误,未初始化
默认状态下,const对象只在文件内有效,如果想要多个文件共享,则需要在一个文件中定义一次,在其他需要使用的文件中声明。不管是声明还是定义都要添加 extern
关键字。
例:
// f1.cc 定义并初始化了一个常量,该常量可以被其他文件访问
extern const int bufSize =fcn();
// f1.h
extern const int bufSize; //和 f1.cc 中的是同一个
const引用
可以把引用绑定到const对象上,但是不能通过引用来修改所绑定的对象。
例:
const int a=1;
const int &b=a; // 正确
b=2; // 常量的引用不能修改
特别的是,可以允许为一个常量引用绑定非常量的对象、字面值,甚至是一般表达式。这种情况下,绑定了一个临时量。
常量引用可以绑定到另一种类型:
double a=1.1;
const int &b=a;
// 编译器会把上面的转换成下面的操作
const int temp =a;
const int &b=temp;
指针和const
指向常量的指针不能用于修改所指对象的值。
const指针就是常量指针,一旦初始化就不能改变所指的地址。
顶层、底层const
顶层就是常量指针 例如: int *const a
底层就是指向常量的指针 例如: const int *a
constexpr和常量表达式
常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。
constexpr
是让编译器来验证表达式是否为一个常量表达式的类型,声明为 constexpr
的变量一定是一个常量,而且必须用常量表达式来初始化,constexpr
指针是一个常量指针。