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

Mat*_*Mat 68 c++ const

const当C++ 中的关键字在成员函数的末尾(在参数列表之后)写入时,它到底意味着什么呢?

Oli*_*rth 75

这意味着,*thisconst该成员函数的内部,即,它不改变的对象.

关键字this是一个prvalue表达式,其值是调用该函数的对象的地址.类的this成员函数的类型XX*.如果声明了成员函数const,则类型thisconst X*.[第9.3.2节§1]

const成员函数中,通过const访问路径访问调用函数的对象; 因此,const成员函数不得修改对象及其非静态数据成员.[第9.3.2节§2]

这意味着const可以const在类的实例上调用成员函数.阿非const成员函数不能被称为上[1]一个const对象,因为它可能尝试修改它.

[1]注意:临时不是const对象,除非它是const类型.

  • @Mat:不,它与优化无关.这完全是关于`const`的正确性.任何合理的编译器都能够在应用优化时自己弄清楚什么是常量.另外,声明成员函数`const`并不能立即帮助编译器,因为`const`可以是`const_cast`.(虽然一般情况下你不应该这样做). (3认同)
  • @Mat:将变量声明为const:`const int*ptr =&m_value` (2认同)
  • 它在设计库/内部API时非常有用,因为它向所述API的用户承诺该成员函数调用不会弄乱数据.值得注意的是,如果用户由于某种原因具有该类类型的const变量,则它们只能使用const成员函数. (2认同)
  • 答案应该是该成员函数中的`*this`是`const`.它是const的对象(这个`指的是什么). (2认同)
  • 实际上,`const`意味着函数_promises_不会改变对象.它可以规避甚至违背承诺.详细说明按位与逻辑常量可能很有用.并且暗示"可变"可能也是一个好主意. (2认同)

wil*_*ell 31

const在函数签名的末尾意味着函数应该假定它所属的对象是const.实际上,它意味着您要求编译器检查成员函数是否以任何方式更改对象数据.这意味着要求编译器检查它是否不直接更改任何成员数据,并且它不会调用任何本身不保证它不会更改对象的函数.

在创建const对象时,您要求编译器确保该对象在初始化之后不会更改.这反过来意味着编译器将检查您是否不直接更改其成员数据,并且您不会调用任何不保证它不会更改对象的函数.

这是const正确性哲学的一部分.从本质上讲,这意味着如果事情现在正常发挥并且它们不会改变那么它们就永远不会破裂.换句话说,不断的事物更容易可靠地工作.const函数签名末尾的这个东西是一个禁止破坏事物的工具.这反过来意味着你应该放在const你可能的任何地方.


Ste*_*end 11

编译器优化是可能的,但主要的好处是强制执行函数声明中表示的契约 - 如果将成员函数定义为const,则编译器会阻止对该函数内对象的任何修改.

您可以mutable在声明中使用此限制来豁免类中的各个字段.这很有用,例如当你有一个封装了自己的lock_guard的类时,即使在const成员函数中也必须更改其值以强制执行线程安全.