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