C ++中的const
关键字在成员函数末尾(在参数列表之后)写入时究竟是什么意思?
答案 0 :(得分:72)
这意味着*this
在该成员函数中是const
,即它不会改变对象。
关键字
this
是一个prvalue表达式,其值是调用该函数的对象的地址。类this
的成员函数中X
的类型为X*
。如果成员函数声明为const
,则this
的类型为const X*
。 [第9.3.2节§1]在
const
成员函数中,通过const
访问路径访问调用该函数的对象;因此,const
成员函数不得修改对象及其非静态数据成员。 [第9.3.2节§2]
这意味着可以在类的const
实例上调用const
成员函数。不能在 [1] 一个const
对象上调用非const
成员函数,因为它可能会尝试修改它。
[1] 注意:临时不是const
对象,除非它是const
类型。
功能
答案 1 :(得分:29)
const
表示函数应该假定它所属的对象是const
。实际上,这意味着您要求编译器检查成员函数不会以任何方式更改对象数据。这意味着要求编译器检查它是否不直接更改任何成员数据,并且它不会调用任何本身不保证它不会更改对象的函数。
当您创建const
对象时,您要求编译器确保该对象在其初始化之后不会更改。这反过来意味着编译器将检查您是否不直接更改其成员数据,并且您不会调用任何不保证它不会更改对象的函数。
这是 const correctness 哲学的所有部分。从本质上讲,这意味着如果事情现在正常发挥并且它们不会改变那么它们就永远不会破裂。换句话说,不断的事物更容易可靠地工作。函数签名末尾的这个const
是一个阻止事物破坏的工具。这反过来意味着你应该尽可能地放置const
。
答案 2 :(得分:11)
编译器优化是可能的,但主要的好处是强制执行函数声明中表达的契约 - 如果将成员函数定义为const
,编译器会阻止对该函数内对象的任何修改。
您可以在声明中使用mutable
来限制班级中的单个字段。这很有用,例如当你有一个封装了自己的lock_guard的类时,即使在const
成员函数中,它也必须更改其值以强制执行线程安全。