const在c++中可以用来修饰内置类型变量, 自定义变量,成员函数,返回值,函数参数等。
1. const 修饰普通类型对象
const int a=6;//a是const对象
auto *cpa = &a;//auto 实际是const int* 类型
//不能直接给对象a赋值,也不能直接通过指针修改对象
a= 7;//错误
*cpa= 7;//错误
//常量对象的指针不建议强转,通过转换后的指针去修改对象,虽然是合法的,
//但是会产生预料外的结果
int* pa=(int*)&a;
*pa=8;// a=8
int b= a+1;//b=7
2. const 修饰指针对象
const修饰指针变量有三种情况:
- const修饰指针指向的内容, 内容为不可变量
- const修饰指针,则指针为不可变量
- const修饰指针和指针指向的内容,二者皆不可更改
//第一种情况
const int a=6;
const int* pa= &a;
*pa=8//错误,指针指向的对象不可更改
pa++ //正确,指针移动sizeof(int)个字节
//第二种情况
int a=6;
int* const pa= &a;
*pa =8;// a=8
int b=9;
pa= &b;//错误,指针不可以改变
//第三种情况
int a=9;
const int* const pa= &a;//地址和值都不可以改变
当const位于* 左边, 值不可以改变,指针可以改变;
当const位于* 右边, 指针不可以改变,值可以改变;
3. const 修饰类成员对象
const修饰类成员对象时,需要在初始化列表中构造成员对象,不能在构造函数体内赋值。
class A {
public:
const int& r;
private:
const int a;
};
A::A(int i):a(i),r(i){}//正确,属于构造初始化
A::A(int i){r=i; a=i;}//错误,属于赋值
4. const 修饰普通函数
void fun(const int a);//值传递的const修饰,也可不加const
void fun(const int& a);//防止函数体内修改 a 的值
void fun(const int* p);//防止函数体内修改p指向的值
void fun(int* const p);//防止函数体内修改p指针
const int fun();//等同于 int fun()
const int* fun1();//返回指针
5. const 修饰类成员函数
- const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值
- const 的成员函数只能调用类的成员函数
void Test::fun() const{}//
注意:(1) const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数,静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。
(2) 如果一个类的两个成员函数,返回值、函数名、参数列表完全相同,其中之一是const,则重载。因为 常成员函数的参数传入this指针是const Class*类型的,参数不同,导致函数签名不同。
void Test::fun(){}
void Test::fun() const{}//this 指针是const Test*
(3) 非只读对象(如a1)调用某个函数(如 disp()),先找非const版本,如果没有,再调用const版本。而常对象,只能调用类中定义的常函数,否则编译器报错。