原创 【博客大赛】《C++ Primer》学习笔记(四)const修饰符

2016-3-15 21:05 1564 14 15 分类: MCU/ 嵌入式 文集: Qt和Cpp
被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吧,这样含义更清晰。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

DiracFatCat 2016-3-14 11:40

为虾米这篇在自己的目录里木有捏?
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
EE直播间
更多
我要评论
1
14
关闭 站长推荐上一条 /3 下一条