成员函数结束时const的含义是什么?

时间:2010-10-30 17:52:51

标签: c++ const

C ++中的const关键字在成员函数末尾(在参数列表之后)写入时究竟是什么意思?

3 个答案:

答案 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成员函数中,它也必须更改其值以强制执行线程安全。

相关问题