const限定符

初始化

const对象必须初始化,一旦创建就不能改变。

变量的const特征只有在试图改变这个变量的时候才会起作用,const对象可以拷贝给一个非const对象

const int i = get_size(); //运行时初始化
const int j = 42; //编译时初始化
const int k; //错误,k是一个未初始化的常量

const对象仅在单个文件内有效!
当多个文件中出现了同名的const变量时,其实等同于在不同文件里分别定义了独立的变量。
如果想在不同文件中使用同一个const变量,需要在一个文件中定义,在其他多个文件中声明。注意声明和定义语句中都需要加上extern。
//file1.cpp,定义并初始化了一个常量
extern const int bufsize = fcn();
//file1.h,声明
extern const int bufsize;


常量引用:不能修改它所绑定的对象(const int &) -- 指的是引用绑定的对象

引用一旦绑定对象,就不能再更改绑定关系(即不能绑定到其他对象)

const int ci = 1024;
const int &r1 = ci;//正确
r1 = 42; //错误:r1是对常量的引用
int j = ci; //正确
int &r2 = ci; //错误,试图让一个非常量引用指向一个常量对象


指向const的指针 -- 底层const

const double pi = 3.14;
double *ptr = π //错误,ptr是个普通指针
const double *cptr = π //正确,cptr可以指向一个常量
*cptr = 42; //错误,不能通过cptr改变其所指向的常量
double dval = 3.14;
cptr = &dva; // 正确,虽然dval能被改变,但是不能通过cptr改变dval的值

所谓指向常量的指针仅仅要求不能通过该指针改变对象的值。


const指针 -- 顶层const

int *const p = &a;(指针是对象,也能声明为const,表示p的值不能改变。p的值为地址,即p不能指向其他对象)

const double *const pip = π //pip是一个指向常量对象的常量指针


更一般的:

顶层const表示任意对象是常量

底层const表示指针和引用指向的对象是个常量


常量表达式:编译时就能得到计算结果的表达式。并非所有的const都是常量表达式!也并非字面值常量都是常量表达式!一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定。

const int max = 20; //是
const int limit = max + 1; // 是
int staff = 27; //否
const int sz = get_size(); //否

(C++11)允许将变量声明为constexpr类型,以便编译器验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须由常量表达式初始化
constexpr int mf = 20; //20是常量表达式
constexpr int limit = mf + 1; //mf + 1是常量表达式
constexpr int sz = size(); //只有当size是一个constexpr函数时才是一条正确的声明语句

constexpr后面如果是个指针,则表示指针本身是个常量

const int *p = nullptr; //p是一个指向整型变量的指针
constexpr int *q = nullptr; //q是一个指向整数的常量指针
constexpr const int *r = &i; //r是常量指针,指向整型常量i


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值