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 都不會改變狀態。