常函数:
1、成员函数后加const称为这个函数为常函数
2、常函数内不可以修改成员属性
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
int m_age;
};
此时会报错:
表达式必须是可修改的左值
之所以会发生这样的错误:
在成员函数中都会隐藏一个this指针,而this指针的本质是指针常量(不可以修改指针的指向)。 而const修饰成员函数时,实际上是const Person * const this这一语法。这就造成了指针的指向以及指向的值都不可以修改了。如果在const修饰成员函数时想对部分常函数进行修改要怎么办呢?这就要用到下面的方法
3、成员属性声明时加关键字mutable后,在常函数中依然可以修改
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
mutable int m_age;
};
这样修改数值时就不会报错了。
常对象:
1、声明对象前加const称该对象为常对象
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
mutable int m_age;
int m_A;
};
void test11()
{
const Person p;
p.m_A = 10;
p.m_age = 100;
}
此时在 p.m_A = 10;这一行会报错。就是因为m_age已经使用了mutable方法。
2、常对象只能调用常函数
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
void acd()
{
}
mutable int m_age;
int m_A;
};
void test11()
{
const Person p;
p.ShowPerson();
p.acd();
}
此时在 p.acd();这一行会报错。对象含有与成员勇函数数"Person:acd”不兼容的类型限定符对象类型是: const Person。
因为常对象是不允许修改对象的属性的,而普通的成员对象是可以修改属性的,因此会产生如上问题。