C++ const正确性不要害怕,不要使用它

C++ const正确性不要害怕,不要使用它,c++,constants,C++,Constants,有时我需要传递对象的引用。我知道常量正确性的好处是避免对象中的修改和避免混乱,但有时使用它确实很困难。如果我将一个对象传递给一个const-correct的方法,然后调用另一个不接受任何参数、不修改对象本身且不返回任何内容的方法,那么它会抱怨我需要将其作为const。然后我看到我的整个应用程序在方法的末尾得到const,即使它返回nothing或GetNothing作为参数 void doNothing() const {} 我知道编译器需要确保任何方法都不会修改对象,但这似乎很愚蠢 我的问题

有时我需要传递对象的引用。我知道常量正确性的好处是避免对象中的修改和避免混乱,但有时使用它确实很困难。如果我将一个对象传递给一个const-correct的方法,然后调用另一个不接受任何参数、不修改对象本身且不返回任何内容的方法,那么它会抱怨我需要将其作为const。然后我看到我的整个应用程序在方法的末尾得到const,即使它返回nothing或GetNothing作为参数

void doNothing() const {}
我知道编译器需要确保任何方法都不会修改对象,但这似乎很愚蠢

我的问题是:我应该总是使用const correct,还是有一段时间我可以避免使用并传递一个对象作为引用,而不用担心会发生什么


如果有理论支持,请解释。

对于独立函数,如果函数不修改参数,则应将引用和指针参数标记为常量。对于按值传递的参数,不需要执行任何操作

对于非静态类方法,还有一个隐式的this参数。如果方法本身没有修改,则应该将其标记为const。这样做允许您在const对象上调用该方法。如果不将方法标记为常量,则只能在非常量对象上调用它


隐藏此参数的原因是它很重要,即使方法不接受其他参数。它是您要保护的隐藏参数。

如果某个对象没有修改,请将其设置为常量。这样做的一个简单原因是:不能对常量对象调用非常量成员函数。这显然是因为允许非常量成员函数更改其实例,而不能更改常量实例。因此,无需将函数设置为非常量就会产生逻辑上有缺陷的代码:例如,为什么打印常量矩阵是非法的?这是没有意义的,所以矩阵的打印函数应该是常量

这也适用于自由函数:临时变量只能绑定到常量引用,而不能绑定到非常量引用。所以前者更一般


最后但并非最不重要的一点是:您提到的唯一缺点是反复编写const。所以我问你:输入const需要多长时间?肯定没有足够长的时间来接受程序中的设计缺陷。

如果成员函数的目的是修改对象,则不要声明它为常量。如果目的是不修改对象,则声明它为常量。我不知道这里有什么困惑。也许你可以提供一个例子?我认为,第三句可以缩短为简单地说,有时我发现我需要从一个常量成员调用一个非常量成员,这是一个pita。如果你发现你的大多数成员都是const,那不是一件坏事。也不仅仅是为了程序保护。例如:在常量正确的代码上使用现代优化器可能会有很大的好处。@WhozCraig-很抱歉我的无知,但你能更好地解释一下吗?你认为如果一个应用程序的大部分成员都是常量,这不是一件坏事吗?原因?谢谢。说到API,我们不知道用户可以做些什么来避免混乱,这就是const正确性的原因,对吗?当你把一个对象传递给一个你不知道它更好的方法时,它是常量正确性,你知道它不会修改任何东西,然后把你的对象扔进黑暗中。问题是调用什么都不做,但也必须是const正确性的方法,但如上所述,真正的问题是关于隐藏的“this”。还有一件事,仅仅因为某些方法中的常量,它是一个糟糕的设计?
class Foo
{
    int foo;

public:
    void doNothing() const
    {
        foo = 42;    // not allowed: `this` is const
    }
};