const在C++中是用来修饰内置类型变量、自定义对象、成员函数、返回值以及函数参数
const作用:
修饰变量,说明该变量不可以被修改
修饰指针,分为指向常量的指针和指针常量
常量引用,经常用于形参类型,既避免了拷贝,又避免了函数对值的修改
修饰成员函数,说明该成员函数内不能修改成员变量
1.const修饰普通类型的变量
(1)const定义常量时,要进行初始化
(2)数据类型对于const而言是透明的
const int a;//错误,没有进行初始化
const int a = 7; 等同于 int const a = 7;
(3)常量可以将值赋给其他,但不能给变量再次赋值。
const int a = 7;
int b = a;
a = 8;//错误,不能更改常量的值
int *p = (int *)&a;
*p = 8;
//对于const变量a,我们取变量地址并转换赋值给指向int的指针,然后利用*p = 8重新随变量地址内的值赋值,按输出结果仍然会是7;所以不要轻易对const变量设法赋值。
若要改变常量的值,可以在const前面加上volatile关键字
2.const修饰指针变量
(1)const修饰指针指向内容
const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据,指针本身是变量可以指向其他的内存单元
const int * p = 8;
*p = 9;//错误
(2)const修饰指针
const位于*右侧,表示指针本身是变量,不能指向其他内存地址,指针所指数据可以通过解引用修改
int * const p = 8;
*p = 9;//正确
(3)const修饰指针和指针指向的内容
*左右各有一个const,表示指针和指针所指数据都不能修改
int a = 8;
const int * const p = &a;
3.const参数传递
(1)值传递的const修饰传递,一般这种情况不需要const修饰,因为函数会自动产生,临时变量赋值实参值
void Cpf(const int a)
{
cout<<a;
}
int main()
{
Cpf(8);
}
(2)当const参数为指针时,可以预防指针被意外篡改
void Cpf(int * const a)
{
cout<<*a<<endl;
*a = 9;
}
(3)自定义类型的参数转换,需要临时对象复制参数,对于临时对象的构造,比较浪费时间,因此我们采取const外加引用传递的方法,并且对于一般的int,double等内置类型,我们不采用引用的传递方法
class Test
{
public:
int get() const{}
};
void Cmf(const Test & _tt){}
int main()
{
Test t(8);
Cmf(t);
}
4.const修饰函数返回值
(1)const修饰内置类型的返回值,修饰与不修饰返回值一样
(2)const修饰自定义类型作为返回值,此时返回的值不能作为左值使用,及不能被赋值,也不能被修改
(3)const修饰返回的指针或引用,是否返回一个指向const的指针,取决于我们想让用户干什么
5.const修饰类成员函数
const修饰类成员函数,其目的时防止成员函数修改被调用对象的值
注:const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数。静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。const成员函数不能调用非const成员函数,因为非const成员函数可以修改成员变量
void testConstFunction(int _x)const
{
x = _x;//错误,在const成员函数中,不能修改任何类成员变量
modify _x(_x);//错误,const成员函数不能调用非const成员函数
}
6.const用于封锁直接修饰的内容,该内容变为只读,该变量不能作为左值
const int a = 10;//const封锁a
a = 100;//错误。a作为左值,使用a的写权限,非法
int b = a;//正确。使用a的读权限,合法
const int *p1 = &a;//const修饰指向的内容
p1 = &b//正确。将p1作为左值合法
*p1 = 200;//错误。const修饰指向内容时不能用解引用修改,*p1作为左值非法
int * const p2 = &a;//const修饰指针p2
p2 = &b;//p2不能作为左值,非法
*p2 = 100;//可以通过解引用修改
const int a * const p3 = &a;//const既修饰指针又修饰指向的内容
p3 = &b;//p3不能作为左值,非法
*ps = 100;//p3也不能通过解引用修改
7.权限只能同等传递或缩小传递
int a = 10;
int b = 20;
const int ca = 10;
const int cb = 20;
int *p = &a;//正确 同等权限
p = &ca;//错误 小权限-> 大权限
const int *cp1 = &a;
cp1 = &b;//正确 大权限->小权限
cp1 = &ca;//正确 同等权限
const int * cp2 = &ca; //正确 同等权限
int * const cp3 = &a;//正确
int * const cp4 = &ca;//错误
const int * const cp5 = &a;//正确
const int * const cp6 = &ca;//正确