问题引入:
看下面这一段代码:
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
// void Print() const
// {
// cout << "Print()const" << endl;
// cout << "year:" << _year << endl;
// cout << "month:" << _month << endl;
// cout << "day:" << _day << endl << endl;
// }
private:int _year; // 年int _month; // 月int _day; // 日
};
void Test()
{Date d1(2022,1,13);d1.Print(); //正常运行const Date d2(2022,1,13);d2.Print(); //编译报错
}
- 为什么会产生这种情况呢?
是因为类内部的this指针,它的类型是 Date * const 类型,它指向的地址不可修改,但是指向的内容是可以修改的。而上图中的d2,const的内容是不可修改的,调用Print()之后,会产生权限放大的错误,因此编译不通过。 - 如何修改这种错误呢?
只需要在成员函数后面,加上const即可修改this指针的类型变为:const Date* const 类型。改成这样后,虽然d1调用会产生权限缩小,但这种问题是允许发生的,不会报错。
-
const对象可以调用非const的成员函数吗?
不可以,调用后会权限放大,不可以。 -
非const对象可以调用const的成员函数吗?
可以,调用后权限缩小,可以发生。 -
const成员函数内可以调用其它的非const成员函数吗?
不可以,同样是调用后权限放大。 -
非const成员函数内可以调用其它的const成员函数吗?
可以,权限缩小允许发生。
因此为了防止这样的事情再发生,如果我们确定不会修改这个函数的参数,那么我们就使用const来修饰它,避免发生权限的问题。而且只有指针和引用会产生权限的问题。