1. const成员变量
const修饰的成员变量只能用构造函数初始化列表进行初始化,不能进行赋值初始化,引用和const一样,只能在初始化列表进行初始化。
class Date
{
private:
int _year;
int _month;
const int _day;//声明const变量
public:
Date(int year=1990,int month=1,int day=1)
:_year(year),
_month(month),
_day(day)
{
//_day=day;//error,试图给const类型变量赋值
}
};
初始化列表先于构造函数的函数体执行,且初始化顺序和成员变量的声明顺序相同的。
2. const成员函数
在成员函数后面加const,const修饰this指针所指向的对象,保证调用这个const成员函数期间对象在这个函数内不会改变。几点规则:
- const成员函数不能调用其他的非const成员函数,非const成员函数可以调用const成员函数
- const成员函数可以访问对象的所有成员变量
- 非const对象可以调用非const成员函数也可以调用const成员函数
- const对象只能调用const成员函数,也就是说,const成员函数是const对象的唯一对外接口
class Date
{
private:
int _year;
int _month;
const int _day;//const 成员变量只能用初始化列表初始化,引用也一样,因为两者只能初始化不能定义
public:
Date(int year = 1990, int month = 1, int day = 1)
:_year(year),
_month(month),
_day(day)
{
//_day = day;//试图给const成员变量赋值。错误,只能初始化
}
void Show() //const
{
/*cout << _year << "-" << _month << "-";
cout << _day << endl;*/
cout << "Show()" << endl;
Date::show();//非const成员函数可以调用const成员函数
}
void show() const
{
cout << "const show()" << endl;
//Date::Show();//const成员函数不能调用其他的非const成员函数
}
};
void Test()
{
Date d1;//非const对象既可以调用非const成员函数也可以调用const成员函数
d1.Show();
d1.show();
const Date d2;//const对象只能访问const成员函数,const成员函数是常对象对外的唯一接口
d2.show();
}