本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第3章,第3.7节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.7 编译器如何实现const 成员函数
C++面向对象高效编程(第2版)
了解编译器如何强制执行逐位常量性(bitwise constantness
)非常有趣。记住,成员函数没什么特别,它只是一个带有奇怪名称和this指针的函数。那么,编译器如何能检测到成员的赋值?
这非常简单。数据成员和函数之间唯一的连接就是this
指针。const
成员函数必须把调用它的对象当做const对象,这可以通过将this
指针声明为指向const
的指针轻松地做到,很简单。现在来看看带有显式声明this指针的HowMany原型:
`
unsigned HowMany(const TIntStack* this);`
根据这个声明,任何通过指针给对象内部的数据成员赋值都是非法的,因为该this指针是一个指向常量的指针。
在同一个类中,可以包含两个相同的函数,一个是const
函数,另一个是非const
函数。这完全可行,而且在某些环境中非常有用。
注意:const
成员函数不能在它的实现中调用另一个非const
成员函数。因为相同的对象(相同的this指针)也可以调用非const
成员函数,而此非const成员函数可以随意修改对象。这违反了调用const成员函数的常量性(constantness
),编译器将会检测出来。
Eiffel:
Eiffel支持与const成员函数非常类似的概念。Eiffel有两种类型的成员函数:过程(procedure
)和函数。过程与普通的成员函数类似,但它们无返回值。函数是一个操作,根据对象中包含的值进行计算,并返回计算的值,这样的函数不会改变对象的状态。因此,过程和函数都与const
成员函数类似。Smalltalk
并没有类似的概念。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。