1.无类:
const可以修饰指针,也可以修饰指针指向的内容,还可以修饰引用、返回值、形式参数等。
(1)修饰指针:int a = 10; int *const p = &a; 表示指针本身不能更改。
(2) 修饰指针所指向的内容:int a= 10; const int *p = &a; 表示指针指向的内容即对p解引用不能被赋值。但是a本身还是能修改的。
(3)修饰引用:int a = 10; const int& b = a; 表示引用本身不能更改。但是a本身还是可以改的。
(4)修饰返回值,int a = 10; const int& get_int(){ return a;},表示返回值不能充当左值。
(5)修饰形式参数:int get_a(int const&a)如果传递一个引用,且这个引用加了const修饰,表示形参不能修改进而无法修改到我实参的值,这种手法也常用于防止无意修改实参产生不可预期的后果。
2.有类:
const放在成员函数参数列表右边可以修饰this指针、也可以修饰成员变量表示我的成员变量为常数据成员,还可以修饰一个对象。
(1)修饰this指针:表示指向的内容不能更改即不能修改成员变量,可以改被mutable修饰过的成员变量或者常成员函数(const放到参数列表右边修饰过的成员函数)里定义的局部变量。此时这样的函数叫做常成员函数
(2)修饰成员变量:表示数据成员不能更改。此时这样的成员变量叫常成员变量。
(3)修饰对象:表示对象不能调用非const方法。因为此时这样的方法有更改对象数据成员的风险。此时这样的对象叫常对象。
接下来我们通过一段简短的代码来加深对上述知识的理解。
usingnamespacestd; classTest{ public: voidset_a() const { /*a = 20;*/// 报错,const成员函数无法修改成员变量a2=20; // 可以,mutable修饰的成员变量表示我这个变量对于我的对象来说无关紧要你可以去改它 } voidset_b() { //b = 20; // 报错,const修饰的成员变量不能修改 } Test() =default; ~Test() =default; private: inta1=10; mutableinta2=10; constintb=10; }; constint&get_a1(constint&b) // 修饰形式参数,b不能改,从而保证了a1不会被无意改掉{ returnb; } intmain(void) { inta1=10; inta2=20; int*constp1=&a1; //表示指针本身不能更改//p = &a2; // 试图更改const指针将会报错constint*p2=&a1; //*p2 = 50; // 试图通过const*指针更改p2所指针指向的内容报错a1=50; // a1自己还是可以改的constint&b=a1; //b = 50; // 试图通过const引用更改a1的值报错a1=50; // a1自己还是可以改的/*get_a1(a1) = 10; *///报错,const修饰过的返回值类型不能作为左值Testconsttest; //test.set_b(); //报错,const对象无法调用非const方法,有数据修改的风险return0; }