const
pointer to const:指向常量的指针(被指向的对象是常量)
const pointer:常量指针(指针本身是常量)
[对被指向对象的修饰] * [指针本身的修饰]
====================================================
指向常量的指针:被指向的对象是常量,修饰的是被指向的对象。
不能用于修改其所指对象的值(被指向的对象是常量)。
const int s32val = 5;//常量 const int *pint = &s32val;//const在*前,那么说明被指向的对象是const int型。*pint是不能改变。(pint是可以改变的,但是改变没有意义。)
s32val是常量,pint是指向常量的指针。
例外:允许一个指向常量的指针 指向 一个非常量对象。
指向常量的指针也没有规定其所指的对象必须是一个常量。只是规定不能通过该指针改变指向对象的值。
------------------------------------------------------------
常量指针:指针本身是常量,指针不能改变。和常量定义意义,必须初始化。
int x = 10; int *const pint = &x;//const在*后面,修饰pint,所以pint是常量,不能改变,但是*pint是可以改变的。
可以*pint = 12;这样的方式去修改,但是不能pint++,这类操作。
------------------------------------------------------------
指向常量的常量指针
const int *const pint = &x;
==========
top-level const:指针本身是常量(*右边)
low-level const:指向的对象是常量(左边*)
记忆方法,尊右为顶。
==========
c++11的新规定:
constexpr类型。
常量表达式:不会改变并且在编译过程就得到计算结果的表达式。
const int max=30;
const int mmax = max+1;
是常量表达式。
int unstat = 11;
int getval = val();
不是常量表达式,unstat是普通int类型,val()不是在编译阶段就能确定的值。
用constexpr验证:
constexpr int mf = 20;
constexpr int limit = mf+1;
constexpr int sz = getval();只有getval是一个constexpr函数,才是正确声明。