C++学习之路(指针2 const限定符)

指针真是让人头疼的东西,我们继续。

const限定符

值不发生改变。
默认情况下,const对象仅在文件内有效

const int a=512

编译器会将所有用到a的地方全部替换为512.
一个程序中多个文件下同名的const对象是不同的对象。
为使文件间进行共享,对const对象无论声明还是定义,都加上extern关键词

extern const int a=251;

对const对象的引用成为对常量的引用
这就是一个例外,可以给const对象引用时赋初值。

int i =42;
const int &r1=i;/正确
const int &r2=42;//正确
const int &r3=r1*2;//正确
int &r4=r1*2;//错误,r4是一个普通非常量引用。

原理

double a=3.14;
const int &r=a;

编译器在执行会将代码变成如下形式:

const int temp=a;
const int &r=temp;

r绑定了一个临时量对象,
当r不位常量时,会允许对r赋值,而绑定的是临时值temp,而非a.所以不会将引用绑到临时量上,所以C++认为这样非法。

int i=42;
int &r1=i;
const int &r2i=i;
r1=0;
r2=0;//错误,r2是一个 常量引用。不能改变值

指针与const
指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针:

const double pi=3.1415926;
double *prt=π//错误,prt是一个普通指针
const double *cptr=π//正确,类型,常量都符合规定,
*cptr=42;//错误,不能给常量指针赋值

指针的类型必须与指向对象的类型一致,但是有两个例外,即第一种,允许令一个指向常量的指针指向 一个非常量对象。

dobule o=3.14;
cptr=&o//正确,但是不能通过cptr改变o的值

const指针
把指针本身设置为常量,称为常量指针。其必须初始化,他的值(及存放的地址),*在const之前,说明不变的是指针本身,而非指针对应的值。

const double pi=3.14;
const double * const pip=π//指向常量的常量指针

与上述提到的一致,常量指针本身不能修改,所以不能修改指针本身与指针所指向的对象,而如果普通指针指向常量,是可以通过修改指针,修改指针所指向的对象(而非改变之前所指向对象的值)。
顶层const
这一块相对复杂,我看了好久才大概能明白了。。。
顶层const表示指针本身为常量
(指针的指向的对象不可变,但是指向对象的值可以改变,即地址)
底层const表示指针所指对象为常量
(不可变)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值