常函数:
其定义与注意事项如下:
1.成员函数后加const后,我们称这个函数为常函数
2.常函数内不可修改成员属性
3.成员属性声明时加关键字mutable后,在常函数中依然可以修改
下述代码段将对常函数说明:
首先,由于this指针不需要进行声明,且可以其指向每一个非静态成员函数;所以在下文中,将直接使用this指针代替本身成员函数或者成员变量。
常函数不可以修改成员属性,但是在成员属性前加mutable,则可以对其参数值进行修改。(mutable属于特殊数据种类!)
下述代码的void showPerson() const即所创建的常函数!
下述代码段的const Person p1即所创建的常对象!
class Person
{
public:
void showPerson() const //函数后面加const,则函数就不可以对成员变量作出修改
//this指针写作: Person* const this;
//而函数后加const,就相当于:const Person* const this//这时this指针指向内容不可修改,其指向也无法修改;所以this指向对象的成员属性不可修改
{
//m_A = 100; 会报错!
//为什么呢?
//在函数内部,m_A = 100 -(相等)- this-> m_A = 100
//而this指针的本质是指针常量,即指针指向不可修改
/*this->NULL:*/ //由于this指针指向p,所以会报错
m_B = 200;
}
void func()
{
}
int m_A;
mutable int m_B;//特殊变量,在常函数中也可以修改其值(加上mutable,使得其在常函数中也可以修改)
};
void test01()
{
Person p;
p.showPerson();
}
void test02()
{
const Person p1;//常对象的创建: 常对象只能调用常函数
/*p1.m_A = 100;*/ //这样书写会报错,因为常对象只能调用常函数
//在对成员变量修改时,是无法做到的;但是其可以对加上(mutable)的成员变量作出修改。
//如下作出修改:
p1.m_B = 300;//m_B是特殊的值,在常对象下也可以修改。
/*p1.func();*///这样就无法调用了,常对象只能调用常函数(func函数不属于常函数)
//普通成员函数可以修改成员变量;但是常对象不允许修改成员变量。
}
int main()
{
test01();
system("pause");
}
常对象:
1.声明对象前加const称该对象为常对象
2.常对象只能调用常函数
常对象的说明如下述代码段:
由于常对象只能够调用常函数,常函数是无法修改成员变量的;所以如果想让其中的成员变量发生改变,那么就必须在成员变量前加上mutable,这样就可以使得常对象访问的常函数可以对成员变量进行修改。
下述代码的void showPerson() const即所创建的常函数!
下述代码段的const Person p1即所创建的常对象!
class Person
{
public:
void func1(int a)
{
m_A = a;
}
void func2(int b) const//const修饰函数,使得其成为常函数;但是常函数无法修改对象的成员变量
//如果非要修改,那么就需要在对象的成员变量前加上mutable,这样才可以使成员变量可以修改
{
m_B = b;
}
int m_A;
mutable int m_B;
};
void test01()
{
Person p1;
p1.m_A = 200;
p1.m_B = 200;
const Person p2;
//p2.m_A = 1;//常对象只能够调用常函数!!就算是对象的成员变量也无法修改
p2.m_B = 2222;//因为在m_B前面加了mutable,所以其属于特殊情况,这时候常对象也能够调用
p2.func2(1);//常对象只能够调用常函数。
}