1 常量的概述
为什么使用const
*代码更容易维护
*确保一些不变量不会被误修改
常量分类
*常变量、常饮用、常对象、常数组、常指针
常量的定义
*类型 const 变量名=初始化表达式
*表明定义一个特定类型的变量,且其值不可变
*也可以写为:const 类型 变量名=初始化表达式
2 常变量的定义与使用
定义:const 类型说明符 变量名
*含义:所定义的变量是常量,不可修改
*注意:由于常量定义后不可修改,所以在定义时需要初始化
例如:
const int N=10;//定义一个整数常量N
int const M=100;//定义一个整数常量M
float const d=3.9;//定义一个浮点数常量d
N=11;//该语句不正确,因为N为常量不可修改
const double pi;//无初始化,该定义无意义,且编译无法通过
3 常引用的定义及使用
定义:const 类型说明符 &变量名=初始化
定义时需要对其值进行初始化
该定义表明:不可通过所定义常变量修改值
例如:
int N=10;//定义一个普通变量N
const int &M=N;//定义常引用M,初始化为N
M=100;//通过M不可修改,所以编译无法通过
N=100;//通过N可以修改
作用:保护变量值,避免被修改
4 常对象
在对象部分再说
5 常指针的定义及使用
定义:
形式1:(指针指向的元素值不可变)
const 类型说明符* 指针名=初始化表达式
等价于:
类型说明符 const * 指针名 =初始化表达式
例如1:
int n=10;
int const *p=&n;//定义一个常指针,指向N变量
*p=11;//不可修改
例如2:
int n=10;
const int * p=&n//等同于int const * p=&n;
*p=11;//不可修改
例如3:
const int n=10;
const int * p1=&n;
int * p2 =&n;//不可让非常指针指向常变量
*p2=11;//避免对值的误修改
定义:
形式2:(指针指向不可变)
类型说明符*const 指针名=初始化表达式;
例如:
int n=10,m=20;
int * const p=&n;//定义常指针,其指向不可变
*p=11//指向的值可变
p=&m//指向不可变
6 常数组的定义及使用
定义:const 类型名 数组名[维数]=初始化表达式
含义:所定义的数组是常数组,数组元素值不可修改
注意:在定义时需要初始化
注意:即使通过指针,也不可改变数组元素值
例如:
const int N=3;
const int arr[N]={1,2,3} //定义常数组arr,并初始化
arr[0]=6;//不可修改数组元素值
int *p=arr;//不可复制给指针p
int const *p=arr;//或者 const int *p=arr;
7 const 在函数中的应用
应用1:在函数的形参中利用const修饰
定义:类型 函数名(const 类型 形参1,。。。);
效果:使函数中被const修饰的形参值不会被修改;
例如1:
void fune (const T a);//对于非指针类型,没必要
void func(const T &a);//确保值不会被误改,同时引用方式可以提高函数执行效率
void func(const T *a);//确保指针指向的值不会被修改
例如2:
void funb(int a1,int &b1,int * &c1,const int a2,const int &b2,const int *c2)
{
a1++;b1++;*c1=*c1+1//可以修改
a2++;b2++;*c2=*c2+1;//均不可修改,编译无法通过
}
例如3:(常指针的应用)
void fun2(const char* s){//确保s指向的数据不会被修改
cout<<s<<endl;
s[0]=' ';//对指向数据修改引发编译错误
s=nullptr;//但是s指针指向可以修改
}
7 const在函数中的应用
应用1:利用const修饰函数参数:
const修饰常与引用传递一起使用
对于非内部数据类型的输入参数,“cosnt引用传递”比“值传递”更高效,且能控制数据不会被修改。
对于基本数据类型一般不用引用传递,除非有明确的目的,例如利用其返回值
如果参数作输出用,不论其类型,都不能加const修饰,否则该参数将失去输出功能
应用2:利用const修饰函数的返回值
定义:const 类型 函数名(函数参数列表)
效果:使函数的返回值不被修改,接受返回值的变量也需要是常量;
例如1:
const char *getstring(,,,)//函数的定义
char *str=getstring(,,,)//出现编译错误
const char *str=getstring(,,,);//正确
例如2:
const int getint(,,,)//函数的定义
int i=getint(,,,)//编译正确
const int j=getint(,,,);//正确
为什么??? 与例一的区别在哪里??
因为int i=getint(,,,)运行后,返回的值分变成了两份
一份在i,一份在函数里,这时候,i不用const接受也没问题,
因为无论i怎么变,函数里的返回值都不变
8 c和c++中常量的区别
c++中:const正常情况下是看成编译器的常量,编译器并不为const分配空间,只是在编译的时候将其值保存在名字表中,并在适当的时候折合在代码中
c中:const是一个不能被改变的普通常量,编译器不知道编译时的值。
例如:
const int N=10;
int arr[N];//c中不正确,c++中正确
9 cosnt 和#define
区别:
c++中定义常量的时候不建议采用define,因为define只做简单的宏替换,并不提供类型检查
是否const可以替换#define
否,#define中还有许多其他功能是const所不能完成的。