有时我需要传递对象的引用。我知道常量正确性的好处,以避免对对象进行修改并避免混乱,但有时使用它真的很难。如果我将一个对象传递给一个 const 正确的方法,并且我调用另一个不接受任何参数并且不修改对象本身并且不返回任何内容的方法,它会抱怨我还需要将其作为 const 也是如此。然后我看到我的整个应用程序在方法的末尾得到"const",即使它不返回任何内容或什么也没得到任何参数。
void doNothing() const {}
我知道编译器需要确保任何方法都不会修改对象,但这似乎很愚蠢。
我的问题是:我应该始终使用 const 正确,还是有一段时间我可以避免使用并将对象作为引用传递而不关心会发生什么?
如果背后有理论,请解释一下。
对于独立函数,如果函数不修改参数,则应将引用和指针参数标记为const
。您无需对按值传递的参数执行任何操作。
对于非静态类方法,还有一个隐式this
参数。如果方法本身不修改this
,则应将方法本身标记为const
。这样做允许您在const
对象上调用该方法。如果不将方法标记为const
则只能在非const
对象上调用它。
class Foo
{
int foo;
public:
void doNothing() const
{
foo = 42; // not allowed: `this` is const
}
};
隐藏的this
参数是它很重要的原因,即使方法没有其他参数。这是您要保护的隐藏参数。
如果某些内容没有修改您的对象,请将其const
。这样做的原因很简单:不能在const
对象上调用非const
成员函数。这显然是因为允许非const
成员函数更改其实例,而const
实例不能更改。因此,使函数无需const
会产生逻辑上有缺陷的代码:例如,为什么打印const Matrix
是非法的?这没有意义,因此应该const
矩阵的打印功能。
这也适用于自由函数:临时函数只能绑定到const
引用,不能绑定到非const
引用。所以前者只是更笼统。
最后但并非最不重要的一点是:你提到的唯一缺点是一遍又一遍地写const
。所以我问你:你打const
需要多长时间?肯定不够长,无法接受程序中的设计缺陷。