常成员函数 —— c++ 函数名后面的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”,因此无法对其进行修改 





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值