一、const 修饰变量
1. const 修饰指针变量时:
1.1 只有一个const时,如果const 位于 * 的左侧:(和int 位置无关) 表示指针所指的数据是常量,不能通 过该指针修改实际数据,但是可以外部修改内存数据;指针本身是变量,可以指向其他的内存单元
int num = 1024;
const int num1 = num; //合法
//num1 = 100; //不合法
const int *ptrNum = # //等价 int const *ptrNum_1 = #
int const *ptrNum_1 = #
ptrNum = &num1; //合法
ptrNum_1 = &num1; //合法
//*ptrNum = 10; //不合法
//*ptrNum_1 = 10; //不合法
1.2 只有一个const时,如果const位于 * 的右侧:表示指针本身是常量,不能指向其他的内存单元,所 指向的数据可以修改
int * const ptrNum3 = # //定义的时候必须初始化
//ptrNum3 = ptrNum; //不合法
*ptrNum3 = 11; //合法
1.3 如果有两个const 位于 * 的左右两侧,表示指针和指针所指向的数据都不能通过该指针改变
二、const 修饰引用
不能通过该引用修改变量的的值(const 常量),但是外部可以修改变量的值。
void Test(const int num)
{
//num = 123 //传递过来的参数num在函数体内不可改变
}
void Test(const Student &stu)
{
//const成员函数不能调用非const成员函数
//const修饰引用时,不能修改对象的任何成员
}
三、const修饰返回值
void Show() const {}
void Test(const Student& stu)
{
stu.Show(); //此时函数应该加const 修饰,否则报错
//如果函数要返回局部对象,就应该直接返回这个对象,而不要返回对象对的引用
//在可以返回对象,也可以返回引用时,就应该首选引用,因为效率高
}
四、成员函数末尾加const
- 说明这个成员函数不会修改该对象成员变量的值(注意:不但要在成员函数声明中加 const,在函数定义中也要加const修饰,否则编译报错)。
void GetName() const{}
注意:
- const 修饰的对象,只能调用const 修饰的成员函数,不能调用非const成员函数,非 const 修饰的对象,const和非const修饰的成员函数都可以调用。
const 不能放到普通函数末尾修饰。
五、mutable修饰成员变量
一个成员变量一旦被mutable修饰了,就表示,这个成员变量永远处于可以被修改状态,即便在 const 结尾的成员函数中,也可以被修改。