Const 正确性

this cv-qualifiers 的主要用途之一是 const 正确性 。这是保证只有访问该实践需要修改一个对象,是能够修改的对象,并且任何(成员或非成员),其不需要修改一个对象不具有到该写访问功能对象(无论是直接还是间接)。这可以防止无意的修改,使代码更少错误。它还允许任何不需要修改状态的函数能够获取 const 或非 const 对象,而无需重写或重载该函数。

const 正确性,由于其性质,从下到上开始:任何不需要改变状态的类成员函数都被声明为 const ,因此可以在 const 实例上调用它。反过来,当不需要修改时,这允许传递引用参数 const,这允许函数在不抱怨的情况下接受 const 或非 const 对象,并且 const-ness 可以向外传播方式。因此,getter 经常是 const,任何其他不需要修改逻辑状态的函数也是如此。

class ConstIncorrect {
    Field fld;

  public:
    ConstIncorrect(const Field& f) : fld(f) {}     // Modifies.

    const Field& get_field()       { return fld; } // Doesn't modify; should be const.
    void set_field(const Field& f) { fld = f; }    // Modifies.

    void do_something(int i) {                     // Modifies.
        fld.insert_value(i);
    }
    void do_nothing()        { }                   // Doesn't modify; should be const.
};

class ConstCorrect {
    Field fld;

  public:
    ConstCorrect(const Field& f) : fld(f) {}       // Not const: Modifies.

    const Field& get_field() const { return fld; } // const: Doesn't modify.
    void set_field(const Field& f) { fld = f; }    // Not const: Modifies.

    void do_something(int i) {                     // Not const: Modifies.
        fld.insert_value(i);
    }
    void do_nothing() const  { }                   // const: Doesn't modify.
};

// ...

const ConstIncorrect i_cant_do_anything(make_me_a_field());
// Now, let's read it...
Field f = i_cant_do_anything.get_field();
  // Error: Loses cv-qualifiers, get_field() isn't const.
i_cant_do_anything.do_nothing();
  // Error: Same as above.
// Oops.

const ConstCorrect but_i_can(make_me_a_field());
// Now, let's read it...
Field f = but_i_can.get_field(); // Good.
but_i_can.do_nothing();          // Good.

正如关于 ConstIncorrectConstCorrect 的评论所示,正确的 cv 资格函数也可以作为文档。如果一个类是正确的,那么任何不是 const 的函数都可以安全地被假定为改变状态,并且可以安全地假设任何函数是 const 都不会改变状态。