c++ const

定义

希望定义这样一种变量,他的值不能被改变

const int bufSize = 512

将bufSize定义成了一个常量,任何试图为bufSize赋值的行为都引发错误

bufSize = 512 //错误

因为const对象一旦创建后,值就不能改变,因此const对象必须初始化,初始化可以使任意复杂的表达式

const int i = get_size();
const int j = 42;
const int k;

初始化和const

const类型的对象上只能执行不改变其内容的操作。
如,const int和普通int一样都能参与算术运算,也能转换为一个布尔值
如,const对象和非const对象的初始化

int i = 42;
const int ci = i;
int j = ci;

默认情况下,const对象仅在文件内有效

  1. 以编译初始化的方式定义一个const对象时
const int bugSize = 512;

编译器会找到代码中所有用到bugSize的地方,用512替换,为了执行这个替换,编译器需要知道变量初始值。如果程序有多个文件,则每个用了const对象的文件都必须访问到他的初始值。要做到这一点,必须在每个用到变量的文件中对它定义(相当于private),为了支持这一用法,同时避免对同一变量重复定义。(每个文件都需要,但如果每个文件都定义会重复)
默认情况下,const对象仅在文件内有效。
多个文件中出现了同名的const变量,等同于在不同文件中定义了独立的变量。

  1. 想在多个文件之间共享const对象,必须在变量定义前加extern关键字

这样定义一次就够了

//.h头文件
extern const int bufSize
//.cc文件(unix系统中使用的)
extern const int bufSize = fcn();

const的引用

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

const int ci = 1024;
const int &r1 = ci; //对,引用和对应的对象都是常量
r1 = 42; //错误,r1是对常量的引用
int &r2 = ci; //错误,试图让一个非常亮引用指向一个常量对象

非常量引用不可指向常量对象
常量对象可以指向非常量对象

不允许直接给ci赋值,也就不能通过引用改变ci,因此,对r2初始化是错误的。
假如初始化合法,则可以通过r2改变它引用对象的值,这是不对的。

const的引用能引用一个不是const的对象

不能改变指向,但能改变指向的内容
对于引用的对象本身是否为一个常量未做限定
对象如果是非常量,可用其他途径改变他的值

int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0; //ok
r2 = 0; //no

不能通过r2修改i的值,i的值可通过其它途径修改,如直接给i赋值,也可像r1一样绑定到i的其它引用来修改

指针和const

指针是对象,可以向其它对象一样,允许把指针定为常量。
常量指针必须初始化,初始化后,它的值(存放的在指针中的那个地址)就不能再改变了。
不变的是指针本身的值,而不是指向的那个值

int *const
int e1 = 0;
ing *c1 = &e1; // c1一直指向e1
const double pi = 3.14;
const double *const pip = π // pip是一个指向常量对象的常量指针

指向常量的指针也可以不指向常量
想要存放常量的地址必须用指向常量的指针

指针本身是一个常量不意味着不能通过指针修改其所值对象值,能否修改依赖所指对象类型。
如pip是一个指向常量的常量指针,pip所指的对象值和pip自己存储的地址都不能变
curErr指向一个一般的非常量整数,可以用curErr修改errNumb的值

*pip = 2.72; //错误,pip是一个指向常量的指针
if (*curErr) {
*curErr = 0; //正确,把curErr所指的对象重置
}

顶层const

还没看懂tbd。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值