const类型成员函数与mutable

const类型成员函数与mutable

原文:http://houhualiang.i.sohu.com/blog/view/42619368.htm

 

const类型的成员函数是指使用const关键字进行修饰的类的成员函数。const类型的成员函数对函数内部的操作加以一定的限制,比如不可以对对象的属性进行修改等,这样可以提高程序代码的正确性。 在使用关键字const对成员函数修饰的时候,将const放在成员函数的后面。在定义对象的时候,可以使用关键字const声明对象为常量对象。对于常量对象,如果使用非常量成员函数来操作,则会出现一个编译错误;同样,对于使用关键字volatile声明的对象, 如果使用非volatile类型的成员函数来操作,也会出现一个编译错误。 如果想修改const类型对象的成员变量,可以使用关键字mutable对该成员变量进行修饰。

 1 #include <iostream.h>
 2 #include <conio.h>
 3 class CDate
 4 {
 5    public:
 6    int year;
 7    mutable int month; // 使用关键字mutable进行修饰
 8    CDate(int y=2000,int m=1)
 9    {
10       year= y;
11       month= m;
12    };
13    int GetMonth() const; // 一个只读函数
14    void SetMonth( int m ); // 一个写函数
15 };
16 int CDate::GetMonth() const
17 {
18    // 下面一行错误,故屏蔽掉
19    // year++; // 但如果是month+ + ;则没问题
20    return month; // 在只读函数中不可以进行改写操作
21 }
22 void CDate::SetMonth(int m)
23 {
24    month = m; // 设置月份
25 }
26 void main()
27 {
28    CDate d1;
29    d1.Setmonth(9);
30    d1.year=1975 ;
31    cout<<"d1:"<<d1.year<<""<<d1.Getmonth()<<"";
32    const CDate d2;
33    d2.month=7;
34    cout<<"d2:"<<d2.year<<""<<d2.Getmonth()<<"";
35    // 下面一句错误,故屏蔽掉
36    // d2.SetMonth(7); // 不可以对常量对象调用非常量成员函数
37    // 下面一句错误,故屏蔽掉
38    // d2.year=1973; // 不可以修改常量对象的成员变量
39 }

运行结果:
d1:1975年9月
d2:2000年7月

说明:
• 在上面的CDate类中,成员变量year为普通类型的变量,而成员变量month为mutable类型的成员变量,所以成员变量month不受const的约束,这可以从上面例程中的多个方面表现。
• 在const类型的成员函数定义体中,不可以直接或间接地修改普通类型的成员变量(mutable类型的成员函数除外)。当对象被声明为const类型后,一般也不可以直接或间接地修改对象的成员变量( mutable类型的成员函数除外)。

原文地址:https://www.cnblogs.com/lx09110718/p/constmutable.html