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.
正如关于 ConstIncorrect
和 ConstCorrect
的评论所示,正确的 cv 资格函数也可以作为文档。如果一个类是正确的,那么任何不是 const
的函数都可以安全地被假定为改变状态,并且可以安全地假设任何函数是 const
都不会改变状态。