2.5.1 常量的定义
变量其实就中是程序在运行过程其值可以改变的内存单元的名字,但是常量就是在程序执行过程中其值固定不变的内存单元的名字,在c++中常用const修饰符定义常量,方法如下:
const 常量类型 常量名=常量值;
说明:
1.const常量必须在定义时初始化,而且一经定义不能在更改(常量名不能出现在=的左边)
2.在c++中,表达式可以出现在常量定义语句中,如果常量是整型,int可以省。
例如:
int j,i,k=9;
const i1=10+k+6;
当常量定义语句中出现表达式时,c++首先计算表达式的值,然后把计算结果在进行赋值;
3.c++中仍然可以使用#define定义常量,但是#define采用宏代换方式进行常量的处理,不具有检查机构,存在不安全性。
2.5.2 const与指针
const可与指针结合,可以分为三种情况
1. typedef *const p const–p:常量指针,即指针是常量,不能被修改,但是其所指的内存区域是变量,可以修改;
2. typedef const *p
const typedef *p const–*p:常量的指针,指针是变量,可以在指向其他内存单元,但是其指的单元是常量,不能在修改;
3. const typedef const *p const-p const-*p:指向常量的常量指针,指针及其所指的内存单元都是常量,都不能被修改。
const对指针和变量之间的相互赋值有一定的影响,const对象的地址只能赋给指向const对象的指针,指向const对象的指针可以被赋予一个非const对象的地址,否则会引起编译错误;
#include <iostream>
using namespace std;
int main()
{
int x=9;
const int y=9;
int *p1;
const int *p2;
p1=&y;//错误,若改成p2=&y,则正确,或者把p1改成p2也正确
p2=&x;
}
2.5.3 指针与引用
1.在定义引用时,可以用const对其进行修饰,使其成为不被允许修改的常量引用
#include <iostream>
using namespace std;
int main()
{
int i=9;
int & rr=i;
const int &ir=i;
rr=8;//这时也会修改原对象和引用的值
ir=7;//错误,ir是const引用,不能通过他修改对应变量的值
}
在定义了const引用时,不可以通过改变对应变量的值,但是可以通过其他非const引用来改变对应的值。
2. const引用可以用常量来初始化,但是非const引用不可以用常量初始化,例如:
#include <iostream>
using namespace std;
int main()
{
int i=2;
const double &ff=10.0;//zzheng正确
const int &ir=i+10;
int &ir=5;//cuowu错误
}
第二三句正确的原因与编译器处理方式有关系,编译器在实现常量引用是生成一个临时对象,然后让这个引用指向这个对象,但是对
用户而言这个对象是不可知的。编译器首先产生不为用户所知的临时变量temp,然后将引用指向它,temp将保持到引用的生命期结束。