問題引入:
看下面這一段代碼:
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來修飾它,避免發生權限的問題。而且只有指針和引用會產生權限的問題。