成员函数结束时的const是什么意思?

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

这意味着*this是在该成员函数内的const ,即它不会改变对象。

关键字this是一个prvalueexpression式,其值是调用该函数的对象的地址。 this在类X的成员函数中的types是X* 。 如果成员函数被声明为const ,则其types为const X* 。 [第9.3.2节§1]

在一个const成员函数中,函数被调用的对象是通过一个const访问path访问的; 因此, const成员函数不得修改对象及其非静态数据成员。 [第9.3.2节§2]

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

[1]注意:除非是consttypes,否则临时对象不是一个const对象。

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

当你创build一个const对象的时候,你要求编译器确保这个对象在初始化之后不会改变。 这反过来意味着编译器将检查你不直接改变其成员数据,并且你不调用任何不保证它不会改变对象的函数。

这是const正确性哲学的一部分。 实际上,这意味着如果事情现在能够正常工作,而且不会改变,那么它们将永远不会被打破。 换句话说,不变的东西更容易可靠地工作。 这个函数签名结尾的const是禁止事情中断的工具。 这反过来意味着你应该把const放在你可能的地方。

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

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