C++ const基础知识

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

编译器会把用到const常量的地方都替换为对应的值

const多文件

默认情况下,const对象被设定为仅在文件内有效,当多个文件中出现同名的const变量时,等同于在不同文件中分别定义独立的变量。

如果想多文件共享,就必须在定义和声明的前面添加extern,这样只需定义一次就可以了

file.cc 
    extern const int bufSize = fcn();//定义,因为bufsize是常量,因此要加上extern使其可以被其他文件使用
 
file1.h
    extern const int bufSize;//声明,与file.cc中的是同一个,extern表明不是本文件独有,它的定义会在别处出现

const引用

称为对常量的引用

非常量引用不能指向常量对象

const int ci = 1024;
int &r2 = ci;//错误!

普通引用的类型必须与其所引用对象的类型一致,且不能为常数。但是const引用不同:

初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换为引用的类型即可。可以是非常量的对象,字面值,甚至一般表达式:

int i = 42;
const int &r1 = i;		//允许将const int&绑定到一个普通int对象上
const int &r2 = 42;		//正确
const int &r3 = r1 * 2;		//正确,r3是一个常量引用
int &r4 = r1 * 2;		//错误,r4是一个普通非常量引用

double dval = 3.14;
const int &ri = dval;		//正确,ri实际绑定的是一个临时量对象。

//可以修改i的值来改变常量引用的值。

指针和const

int i;
const int *p  = &i;
int *q = p;			//错误,不允许const转换为非常量。

指向常量的指针不能用于改变其所指对象的值。

想要存放常量对象的地址,只能使用指向常量的指针。

和常量引用一样,指向常量的指针也没有规定其所指对象必须是一个常量,指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个值不能通过其他途径改变。

double dval = 3.14;
const double *cptr = &dval;
*cptr = 2;		//错误,不同通过cptr来改变dval的值
double a = 1;
cptr = &a;		//正确

指向常量的指针和引用觉得自己指向了常量,所以自觉不去改变所指对象的值。

const指针

常量指针即把指针本身变成常量。常量指针必须初始化,且不能改变。

int errNumb = 0;
int *const curErr = &errNumb;		//常量指针,指针本身的值不能变,可以通过它修改errNumb的值
const double pi = 3.14;
const double *const pip = π		//指向常量的常量指针,指针本身和它指向的值都不能改变。

指针,常量和类型别名

typedef char *pstring;
const pstring cstr = 0;			//const char *cstr = 0;这是错误的理解,不能这么等价,cstr实际上是常量指针。
const pstring *ps;

pstring 是 char*的别名。

注意:cstr是指向char的常量指针,而不是指向char常量(const char)的指针。因为pstring本身是指向char的指针类型,const 实际修饰的是指针对象即char*,错误的拆解以后变成了修饰char了。

顶层const 底层const

顶层const表示指针本身是个常量,底层const表示指针所指的对象是个常量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值