const成员
一、const修饰类的成员函数
const修饰类的成员函数称为const成员函数,实际上是修饰该成员函数的隐含this指针,表明在该成员函数当中不能对类的任何成员进行修改。
说明一下什么是this指针,this指针是每个类的成员函数隐含的第一个参数,当一个对象调用这个成员函数的时候,this指针默认的指向调用它的那个对象。也就是说,在这个成员函数中不用调用即可使用它被包含的类中的成员。
void Display() const/* const Date *this */
{
cout << "Display () const" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
void Display(const Date * this)
{
cout << "Display () const" << endl;
cout << "year:" << this->_year << endl;
cout << "month:" << this->_month << endl;
cout << "day:" << this->_day << endl << endl;
}
以上例子,是为了看清楚const是怎样修饰this指针的,接下来我们来看const的具体应用场景。
1、const对象可以调用const成员函数const对象不能调用非const成员函数
因为const对象的隐含的this指针是const (对象名)* this,而非const成员函数隐含的this指针是(对象名)* this,类型不匹配,同理const成员函数可以被调用。在这里强调一下,两个同名的成员函数,一个是const,一个非const,可以构成函数的重载。
2、非const对象可以调用const成员函数
因为成员函数能够隐式类型转换,将非const类型的this指针,转换成const类型的this指针。
3、const成员函数不能调用非const成员函数
因为const成员函数的this指针是const类型的,在隐式转换中不能将const类型转换成非const类型。同时看出一个规律,隐式类型转换中,低一级的关键字可以转换成高一级的关键字,反之,不可。
二、取地址及const取地址操作符重载
class Date
{
public :
Date* operator&()
{
return this ;
}
const Date* operator&()const
{
return this ;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};