为什么静态成员函数不能是常量?

Why can't static member functions be constant?

本文关键字:常量 不能 静态成员 函数 为什么      更新时间:2023-10-16

我浏览了关于这个主题的现有线程,但对解释不满意。

我能从那里学到的是:

当一个非静态成员函数被声明为const时,限制是强加于这个this指针。由于静态成员函数不涉及this指针,因此不能将它们声明为const

是这样吗?对我来说听起来不太有说服力。我的意思是,我不是在质疑为什么会这样。我只想说出原因。

允许const非静态成员函数修改局部、静态和全局变量;只是不允许通过this指针修改其类的成员(隐式或显式)。因此,允许const静态成员函数修改局部变量、静态变量和全局变量,就像修改非成员函数一样。这将使const毫无意义。

如果你想编写一个根本不允许修改任何非局部变量的函数,你可以将其声明constexpr,尽管这也施加了额外的限制。

函数的常量/非常量区别很重要的原因是,在某些情况下调用非常量函数是不合法的。因此,这种区别可以用来强制执行不变量。

例如,如果将非常量引用传递给函数,则如果类设计正确,则可以保证该函数无法更改引用所引用事物的值。这使您可以避免复制。

此外,非常量引用不能绑定到临时引用。这允许函数指示它们是通过引用返回值还是只获取值。如果由于意外创建了临时值而无意中忽略了返回值,则在编译时会收到错误。

这些都不适用于静态函数,因为没有上下文禁止您调用它们。因此,静态函数不存在这种区别的整个基本原理。

相关文章: