// 当const修饰成员函数时，函数内不能修改普通成员变量，但可以修改mutable修饰的成员变量。 当const修饰类对象时，只能读成员变量，不能修改成员变量的值。可以调用const修饰的成员函数，不
// 能调用普通成员函数
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class A
{
public:
    int x;
    mutable int y;

public:
    void setXY(int x, int y) const
    {
        // this->x = x; // error
        this->y = y;
    }
    void show()
    {
        cout << x << ", " << y << endl;
    }
};

int main()
{
    A a1;
    a1.setXY(1, 2); // const 函数，内部不修改非 mutable 的成员变量
    a1.show();

    // const A a2; // 报错，const 变量必须存在初始值（右值）
    const A a2 = A();
    a2.setXY(0, 30); // const 对象可以访问 const 的成员函数
    // a2.show();       // const 对象不能访问非 const 成员函数
    return 0;
}
