const修饰的类成员函数称为const成员函数
class Date{
public:
void Display()const{
cout << "_year" << "-" << _month << "-" << _day <<endl;
}
private:
int _year;
int _month;
int _day;
};
注意这里的const位置,const位于大括号前,小括号后;该种写法表示const修饰的是内部的隐含的this指针,即上述代码展开写就是如下:
class Date{
public:
void Display(const Date* this){ //此行显示代码,并不能在编译器下正常运行;因为this是隐含的,这种显示的写法只是为了理解。正常代码下不能这样书写
cout << "this->_year" << "-" << this->_month << "-" << this->_day <<endl;
}
private:
int _year;
int _month;
int _day;
};
用上面的代码段主要目的在于表达const实际上影响的是this指针。const不能称为构造函数以及析构函数的成员,这时因为构造函数和析构函数本身就是进行对象的初始化以及清理工作;其本身就是要进行初始化等改变的操作,故不能构成const成员。
注意:this指针的类型是什么?查阅资料我们知道,this指针说的是const * 类型。但是为什么我们几乎在类中找不到真正的const类型的this指针呢?这时因为无论构造函数还是自定义函数,如果其包含参数,需要传参的时候。实参传给形参就会改变隐藏指针this的类型了。如下面代码所示:
class Date {
public:
Date(int year = 1900,int month = 1,int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}
void Display() {
cout << _year << "-" << _month << "-" << _day << endl;
}
void Print() {
*this;
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date d;
d.Display();
system("pause");
return 0;
}
此时this指针类型是Date*,因为Main函数中d的类型是Date且实参传给形参的时候相当于将d的地址传了过去,此时的地址是0x008ffc60
这个地址与上述的this指针一样,不相同的是这时Display函数中的this指针,这就说明了实参传给形参的就是实参的地址;不信,我们还有这个
进行内存监视可以看到d的地址与上述两个相同。
这时候有人就会说了,书上不是说了this的类型是const的。难道书上不对?书上是对的,我们这时看这个
这时我们从Print函数中看到的,这个this指针没有调用任何成员变量,仅仅自身的信息,我们可以看到其类型是Date* const的。这说明this的类型本身就是这样。那为什么我们之前看到的都不是const的呢?除了上述的原因之外,主要就是this与*this的不理解导致的;定义中int* p指针的类型说的是该指针指向的目标的类型是int,即指针内存储的目标类型是int的。代码段中其中p说的是存储的目标的地址,*p说的是目标的值,&p说的才是自己的地址。
从上面我们可以看出,this的类型 Date const * 说的是指向的对象地址不能被修改,因为加了const修饰,而不是自身的地址不能被修改,我们再看编译器的时候发现,this指针的地址调试进去开始并非是实参的地址就是这个原因。