const成员函数
初识
刚听到const成员函数时,以为如同const成员变量一样的写法:const 类型名 函数名(参数);
。
但其实,是:类型名 函数名(参数) const;
这个const
实际修饰的是被隐藏的this
指针常量。
两个问题
class Date
{
public:
Date(int _year = 0, int _month = 0, int _day = 0)
{
this->_year = _year;
this->_month = _month;
this->_day = _day;
}
void show1() const // const成员函数
{
cout << this->_year << '-'
<< this->_month << ' '
<< this->_day << endl;
}
void show2() // 非const成员函数
{
cout << this->_year << '-'
<< this->_month << ' '
<< this->_day << endl;
}
private:
int _year;
int _month;
int _day;
};
const对象可以调用非const成员函数吗?
答案:不可以。
这样做,我们相当于在传参时放大了权限。
非const对象可以调用const成员函数吗?
答案:可以。
这样做,我们相当于在传参时缩小了权限。
总结
成员函数加const是好的,建议能加const都加上。这样普通对象和const对象都可以调用了。但是如果要修改成员变量,成员函数不能加const。
取地址及const取地址操作符重载
class Date
{
public :
Date* operator&()
{
return this ;
}
const Date* operator&()const
{
return this ;
}
private :
int _year ;
int _month ;
int _day ;
};
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!