3 回答
TA贡献1796条经验 获得超7个赞
这意味着,*this
是const
该成员函数的内部,即,它不改变的对象。
关键字
this
是一个prvalue表达式,其值是调用该函数的对象的地址。类的this
成员函数的类型X
是X*
。如果声明了成员函数const
,则类型this
为const X*
。[第9.3.2节§1]在
const
成员函数中,通过const
访问路径访问调用函数的对象; 因此,const
成员函数不得修改对象及其非静态数据成员。[第9.3.2节§2]
这意味着const
可以const
在类的实例上调用成员函数。阿非const
成员函数不能被称为上[1]一个const
对象,因为它可能尝试修改它。
[1]注意:临时不是const
对象,除非它是const
类型。
TA贡献1719条经验 获得超6个赞
const
在函数签名的末尾意味着函数应该假定它所属的对象是const
。实际上,它意味着您要求编译器检查成员函数是否以任何方式更改对象数据。这意味着要求编译器检查它是否不直接更改任何成员数据,并且它不会调用任何本身不保证它不会更改对象的函数。
在创建const
对象时,您要求编译器确保该对象在初始化之后不会更改。这反过来意味着编译器将检查您是否不直接更改其成员数据,并且您不会调用任何不保证它不会更改对象的函数。
这是const正确性哲学的一部分。从本质上讲,这意味着如果事情现在正常发挥并且它们不会改变那么它们就永远不会破裂。换句话说,不断的事物更容易可靠地工作。const
函数签名末尾的这个东西是一个禁止破坏事物的工具。这反过来意味着你应该放在const
你可能的任何地方。
TA贡献1773条经验 获得超3个赞
编译器优化是可能的,但主要的好处是强制执行函数声明中表示的契约 - 如果将成员函数定义为const
,则编译器会阻止对该函数内对象的任何修改。
您可以mutable
在声明中使用此限制来豁免类中的各个字段。这很有用,例如当你有一个封装了自己的lock_guard的类时,即使在const
成员函数中也必须更改其值以强制执行线程安全。
- 3 回答
- 0 关注
- 597 浏览
添加回答
举报