使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下:
<类型说明符> <函数名> (<参数表>) const;
<类型说明符> <函数名> (<参数表>) const;
其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。
class MyClass
{
public:
MyClass(int r1, int r2) { R1=r1; R2=r2; }
void print();
void print() const;
private:
int R1, R2;
};
void MyClass::print() { cout<<"normal print "<<R1<<R2<<endl; }
void MyClass::print() const { cout<<"const print "<<R1<<R2<<endl; }
void main()
{
MyClass r_normal(5, 4);
r_normal.print();
const MyClass r_const(5, 4);
r_const.print();
}
运行后输出:
normal print 54
const print 54
也就是说,普通类对象r_normal调用的是普通成员函数void MyClass::print(),而常对象r_const调用的是常成员函数void MyClass::print() const.
不过,普通类对象r_normal也是可以调用常成员函数的,如下代码是可以运行的:
void MyClass::print_const() const { cout<<"const print "<<R1<<R2<<endl; }
MyClass r_normal(5, 4);
r_normal.print_const();
而如果
常对象
r_const调用普通成员函数却是会编译器报错:
void MyClass::print_normal() { cout<<"normal print "<<R1<<R2<<endl; }
const MyClass r_const(5, 4);
r_const.print_normal(); //编译器报错 error C2662
error C2662: “MyClass::print_normal”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
总结:const对象必须调用常成员函数(<类型说明符> <函数名> (<参数表>) const;),普通类对象可以调用普通成员函数或者也可以调用常成员函数。
其实const改变了隐含的this形参的类型,使得常成员函数不能修改调用它们的对象(this)
PS:
任何通过常成员函数对成员变量的修改都是不允许的:
inline bool visible() const { return (_flags &= F_VISIBLE) ; }
error C3490: 由于正在通过常量对象访问“_flags”,因此无法对其进行修改