成员函数结束时的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]注意:除非是const
types,否则临时对象不是一个const
对象。
const
在函数签名的末尾意味着函数应该假设它是一个成员的对象是const
。 实际上,这意味着要求编译器检查成员函数是否不以任何方式更改对象数据。 这意味着要求编译器检查它是否不直接更改任何成员数据,也不会调用任何本身不能保证不会更改对象的函数。
当你创build一个const
对象的时候,你要求编译器确保这个对象在初始化之后不会改变。 这反过来意味着编译器将检查你不直接改变其成员数据,并且你不调用任何不保证它不会改变对象的函数。
这是const正确性哲学的一部分。 实际上,这意味着如果事情现在能够正常工作,而且不会改变,那么它们将永远不会被打破。 换句话说,不变的东西更容易可靠地工作。 这个函数签名结尾的const
是禁止事情中断的工具。 这反过来意味着你应该把const
放在你可能的地方。
编译器优化是可能的,但主要好处是在强制执行在函数声明中expression的约定 – 如果将成员函数定义为const
,则编译器会阻止对该函数内的对象进行任何修改。
你可以用声明中的mutable
来免除这个限制中的单个字段。 例如,当你有一个封装了自己的lock_guard的类时,它必须改变它的值来强制执行线程安全,即使在const
成员函数中也是如此。