原创
【博客大赛】《C++ Primer》学习笔记(四)const修饰符
被const修饰的变量不可被修改,因此它必须在定义时被初始化。
被const修饰的变量,能进行的操作是它的值不被修改的操作。
被const修饰的变量属于本地,两个文件中的同名const变量是两个独立的变量。
如果需要在多个文件中使用同一个const变量,则:
// file_1.cc
extern const int bufSize = fcn();
// file_1.h
extern const int bufSize;
被const修饰的变量的引用也必须被const修饰:
const int ci = 1024;
const int &r1 = ci;
不被const修饰的变量以及常量,也可以为被const修饰的引用赋值:
int i = 42;
const int &r1 = i;
const int &r2 = 42;
但是常量不可为不被const修饰的引用赋值。
被const修饰的引用,它的对象可以是其他的数据类型,因为编译器会创建临时变量。
不被const修饰的引用,它的对象不可以是其他的数据类型,因为对临时变量的操作无意义。
指针和引用类似:
const double pi = 3.14;
const double *cptr = π
double dval = 6.28;
cptr = &dval;
这里被const修饰的指针,是说它的对象不可被此指针修改。
我们不能通过const指针对修改它指向的object,但object本身可以通过其他途径更改。
如果我们希望指针本身不可被修改呢?
int errNumb = 0;
int *const curErr = &errNumb;
const double pi = 3.1415926;
const double *const pip = π
指针本身不可被修改,称为top-level const;
指针指向的对象不可被修改,称为low-level const。
使用const修饰变量时,仔细考虑对象可否被修改,指针和引用可否被修改。
语法很重要,更重要的是理解客观世界的逻辑。
什么是常量表达式constant expression?
在编译时可以确定值的表达式,称为常量表达式。
const int max_files = 20;
const int limit = max_files + 1;
int staff_size = 24;
const int sz = get_size();
上面四个表达式,是常量表达式吗?
是,是,否,否。
怎么显式的定义常量表达式?
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size();
如果使用了constexpr修饰,编译器就会检查值是否能够在编译时确定。
const int *p = nullptr; // p是指向const int的指针
constexpr int *q = nullptr; // q是指向int的const指针
因此constexpr是top-level const的意思。
需要使用top-level const的时候,就使用constexpr吧,这样含义更清晰。
DiracFatCat 2016-3-14 11:40