2.4 const 限定符

在const创建的对象中需要注意的问题是const对象一旦被创建就无法更改,同时const对象定义是要初始化。
注意定义格式:例:const int i=10;
默认情况下,const限定的变量的作用域被设定为文件作用域。但是在某些时候,我们想多个文件共享const变量时,解决办法就是:对于const变量不管是声明还是定义都添加extern关键字。

2.4.1 const的引用

对常量的引用不能用被用作修改它所绑定的对象:

const int  ci = 1024;
const int &r1 = ci;  //正确:引用及其对应的对象都是常量
  r1 = 42;              //错误:r1是对常量的引用
int  &num_quote1 = num;      //错误:试图让一个非常量引用指向一个常量对象

初始化对const的引用
引用的类型必须与其所引用的对象的类型一致,但是有两个例外,第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
对const的引用可能引用一个并非const的对象

int i=42;                //引用ri绑定对象i
int r1=&i;              //引用ri绑定对象i   
const int &r2=i;        //r2也绑定对象i,但是不允许通过r2修改i的值   
r1=0;                   //r1并非常量,i的值修改为0
r2=0;                   //错误: r2是一个常量引用

2.4.2 指针和const

与引用一样,也可以令指针指向常量或非常量。指向常量的指针不能用于改变其所指对象的值。
指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

const指针

常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。即不变的是指针本身的值而非指向的那个值:

int errNumb=0int *const curErr =&errNumb;   //curErr将一直指向errNumb
const double pi=3.141592;
const double *const pip= & pi;   //pip是一个指向常量对象的常量指针

2.4.3 顶层const

顶层const表示指针本身是个常量,底层const表示指针所指向的对象是一个常量。
在执行拷贝时,作为赋值的右操作符,顶层const 不会对操作有任何影响,因为拷贝操作不改变被拷贝对象的值。
当底层const 对象作为赋值操作的右操作符,拷入和拷出的对象必须有相同的底层const 资格;或者能够相互转换,一般来说非常量可以转化成常量,反之则不行。

int i = 0;
const int *p = &i;//合法,因为指向常量的指针本质上是自我限制,只是限制了通过p 修改i 的行为,但i 还是可以不通过p 自行发生变化的
const int l = 0;
int *const q = &l;//不合法,因为这样意味着常量指针q 指向了一个正常int 类型,而正常int 能进行的操作,对于常量l 来说很有可能是不合法的

2.4.4 constexpr和常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr 类型。

指针和const
constexpr int mf=20constexpr int Limit=mf+1constexpr int sz=Size(); //只有当size是一个constexpr函数时才是一条正确的声明语句。

在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值