常函数
常函数如:
void Print() const{cout<<"..."<<endl;}
常函数内不能修改普通成员变量,可以修改mutable变量。
常对象可以调用常函数,不能调用普通成员函数
由于常函数只能读取数据成员而不能修改,所以可以保证数据的安全。
此处的const实际上是加在this指针上的底层const(this指针本身就是一个顶层const指针)
常函数的this指针就变成了顶层const且底层const,有助于提高函数的灵活性。
因此常函数和虚函数并不冲突,可以将常函数定义为虚函数,如下
class D{
public:
virtual void Print()const {cout<<"D"<<endl;}
};
class DD:public D{
public:
void Print()const override{cout<<"DD"<<endl;}
};
值得注意的是,基类和派生类都要一起带上const,如果派生类中没有则不认为该函数进行了override。
比如:
此处override如果不写则不会报错,实际运行时将有const和没const的Print()看作是两个函数了,也就没法进行动态绑定,调用的都是基类的函数: