前言:
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
class Date { public: Date() :_year(2023) ,_month(10) ,_day(28) {} void print() const //const限定this指针,相当于const Date* this { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { Date a; a.print(); return 0; }
思考下面的几个问题:
1. const对象可以调用非const成员函数吗?
class Date { public: Date() :_year(2023) ,_month(10) ,_day(28) {} void print1() const //const限定this指针,相当于const Date* this { cout << _year << "-" << _month << "-" << _day << endl; } void print2() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { Date a; a.print1(); const Date b; b.print1(); return 0; }
编译器甚至都没有给出print2这个函数的选项,答案自然是不能,但为什么不能呢?
我们定义的对象b是const类型,他的成员变量不能做修改,那他的别名的成员变量也不能修改,而我们上述代码中b对象不能调用print2函数是因为print2函数有权限放大,所以不能调用。
2. 非const对象可以调用const成员函数吗?
class Date { public: Date() :_year(2023) ,_month(10) ,_day(28) {} void print1() const //const限定this指针,相当于const Date* this { cout << _year << "-" << _month << "-" << _day << endl; } void print2() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { Date a; a.print1(); const Date b; b.print1(); Date c; c.print2(); return 0; }
权限放大不可以,但可以有权限的缩小,c对象成员变量可以修改,也可以不修改,他的别名成员变量不可以修改是合理的。
3. const成员函数内可以调用其它的非const成员函数吗?
4. 非const成员函数内可以调用其它的const成员函数吗?
这里是权限的缩小,是OK的