C++的常量成员函数

在C++中,若类的成员函数的形参列表之后紧跟着const关键字,则该成员函数为常量成员函数。如下:

struct Sales_data
{
	//数据成员
	std::string bookNo;
	unsigned uints_sold = 0;
	double revenue = 0.0;

	//成员函数
	std::string isbn() const { return bookNo; } //常量成员函数
	Sales_data& combin(const Sales_data&);
};
当我们调用类的成员函数时,实际上是调用具体的某个对象的成员函数。成员函数是通过一个名为this的额外的隐式形参来调用它的那个对象。即当我们调用某个对象的成员函数时,会将this指针和该对象进行绑定。

在成员函数内部,我们可以直接使用,并且能够正确的使用调用该函数的对象的成员,而不用通过成员运算符来具体指定某个对象,就是因为this所指的正是这个对象。因为this的目的总是指向“这个”对象,故this是一个常量指针,不允许改变this保存的地址(它保存的地址正是“这个”对象的地址)。


成员函数中,形参列表后面的const关键字,作用是修改隐式this指针的类型。前面说this指针是常量指针,其保存的地址不能改变,即只能指向“这个”对象。但是如果该对象被声明为常量对象,此时虽然this指针始终指向该常量对象,但是this却并不是一个指向常量的指针,它只是一个常量指针。换句话说,允许通过this指针来改变这个常量对象,岂不是有问题了?

这就意味着,我们不能调用一个常量对象的普通函数。因为这意味着将普通函数的隐式this常量指针,跟一个常量对象进行绑定。关键字const的作用就是将this指针由常量指针改为指向常量对象的常量指针。如此,可以被常量对象所调用。


由上面分析可以知道:

(1)常量成员函数形参列表后的const关键字,意味着this指针指向常量。

(2)常量成员函数不会改变调用它的对象(因为this指针已经被改为指向常量的指针)

(3)非常量对象可以调用常量成员函数,常量对象只能调用常量成员函数不能调用普通成员函数(即使该普通成员函数不改变调用它的对象)。


参考:《C++ primer》 第五版


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值