常成员函数 —— c++ 函数名后面的const

来源:互联网 发布:时时彩组号软件 编辑:程序博客网 时间:2024/05/17 03:27
使用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 54const 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”,因此无法对其进行修改 





原创粉丝点击