【C++学习之(二)】详解const 常量指针 指向常量的指针 常量引用 指向常量的引用

当想定义一个不会被改变的变量时 可以用const 限定符加一限定

由于const对象一旦创建后就不能改变 因此必须初始化
const int i=42;
const int j;//错误

const int bufSize=512;
bufsize=32;//can not be change

const int i=42;
i++;//不能操作
初始化可以是任意复杂表达式
const int i=10;
const int j=get_size();
const对象可以使用的操作

任何基本类型可以进行的操作,const对象都可以,唯一涉及到改变这个变量的内容时会受到限制。

这个不改变const对象的操作之一就包括初始化
 int i=42;
 const int ci=i;
 int j=ci;
const对象的有效范围——文件
想要在文件之间共享const对象就可以在const对象定义和声明之前加extern限定符,表示这个对象不是此文件独有,其他地方也出现
extern const int bufsize=512;//.cpp文件
extern const int bufsize;//.h文件
实验证明定义时不加extern 声明时加extern具有同样效果

对常量的引用( reference to const)

对常量的引用表示 把引用绑定在const对象上

const int  ci=0;
const int &r1=ci;//正确 引用及其对象对应都是常量
r1=42;//错误:r1是对常量的引用 不能修改
int &r2=ci;//错误:试图让一个非常量引用一个指向一个常量对象

常量引用是对const的引用 简称“常量引用”

*引用类型必须与其所引用对象的类型一致

例外:1.初始化常量引用时 允许任意表达式作为初始值 只要该表达式能转换成引用的类型即可
初始化常量引用可以用 非常量值(int double),字面值(42),表达式
反之初始化非常量引用就不可,类型必须严格匹配
int i=42;
const int &r1=i;
const int &r2=42;
const int &r3=r1*2;
int &r4=r1*2;//错误 类型不匹配
//

在这里插入图片描述在这里插入图片描述

试想如果编译器通过 那么就认为可以通过r4来改变r1
double dval=3.14;
const int &ri=dval;
cout<<ri<<endl;//3
double dval=3.14;
const int &ri=dval;
dval=10.3;//this value is never used
cout<<dval<<endl;//10.3
cout<<ri<<endl;//任然是3
编译器创建一个临时量 ri绑定的是系统创建的一个int型temporary改变dval并不会改变ri的值了
int i=42;
const int &r1=i;
i++;
cout<<r1<<endl;//43
基础类型相同就绑定的是一个值?
对const的引用可能引用一个并非const对象
int i=42;
const int &ri1=i;
int &ri2=i;
ri1++;//错误
ri2++;//可通过ri2修改 ri1也改变
cout<<ri1<<endl;
cout<<ri2<<endl;

指向常量的指针(pointer to const)

const double pi=3.14;
double *ptr=&pi;//错误 类型不匹配
const double *cpr=&pi;//正确 类型匹配
*cpr=42;//错误 不能赋值
指针类型必须和所指向内容类型严格匹配
例外1:允许令一个指向常量的指针指向一个非常量对象
double dval=3.14;
cptr=&dval;
不允许通过此指针修改该变量 但是允许通过其它方式修改
int i=12;
const int *p=&i;//可以 但是一厢情愿 通过*P 不可以改变I 但是其它方式可以改变I
i++;
cout<<*p<<endl;
指向常量的指针可以不初始化 可以指向不同的对象

常量指针(const pointer)

由于指针是一个对象 因此可以把指针本身定义为一个常量
常量指针必需初始化 且初始化之后不能改变所指向的地址
const int *p;
int *const p1; //必须初始化
const int *const p3;//必须初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值