如果不害怕不使用它,那就是正确性

时间:2014-12-07 16:43:28

标签: c++ const

有时候我需要传递一个对象的引用。我知道const正确性的好处,以避免对象的修改和避免混乱,但有时它真的很难使用它。如果我将一个对象传递给const正确的方法,并且我调用另一个不接受任何参数的方法,并且不修改对象本身并且不返回任何内容,它会抱怨我需要将它作为const作为const好。然后我看到我的整个应用程序得到了" const"在方法结束时,即使它什么都不返回,也没有什么可以作为参数。

void doNothing() const {}

我理解编译器需要确保任何方法都不会修改对象,但这似乎很愚蠢。

我的问题是:我是否应该始终使用const更正或者我可以避免使用和传递对象作为参考而不关心会发生什么?

如果背后有理论,请解释。

2 个答案:

答案 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需要多长时间?肯定不足以接受你的计划中的设计缺陷。