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