const正确性

对于 const Fred * p来说, p是一个指针, 指向了一个 常量Fred. 假设Fred 类有一个叫做 inspect() 的 const 成员函数,那么写 p->inspect() 是可以的。但如果 Fred 类有一个非 const 成员函数 mutate() ,那么写 p->mutate() 就是个错误(编译器会捕获这种错误;不会在运行时测试;因此 const 不会降低运行速度)。

也就是说const对象只能调用const方法。

同理, const引用也是这样, 比如const Fred & x, x也只能调用const方法。

那什么是const成员函数。 就是这个函数只能访问 成员属性, 不能修改成员属性。

 class Fred {
 public:
   void inspect() const;   // 该成员保证不修改*this
   void mutate();          // 该成员可能会修改*this
 };

 void userCode(Fred& changeable, const Fred& unchangeable)
 {
   changeable.inspect();   // 正确:没有修改一个可修改对象
   changeable.mutate();    // 正确:修改一个可修改对象

   unchangeable.inspect(); // 正确:没有修改一个不可修改对象。
   unchangeable.mutate();  // 错误:试图修改一个不可修改对象。
 }

const方法可以有 const对象 和 非const 对象调用, 但是 const对象只能调用 const 方法。


const重载, 同名的const方法和非const方法是重载的, 比如

 class Fred { ... };

 class MyFredList {
 public:
   const Fred& operator[] (unsigned index) const;  ←下标运算符通常成对出现
   Fred&       operator[] (unsigned index);        ←下标运算符通常成对出现...
 };

同理, 对于参数来说, const参数和非const参数也不是同一个类型, 比如 const std::stringstd:string 就不是同一个类型


const Fred *p有什么含义, p是一个指针, 指向一个 const对象Fred, p只能调用 Fred 的 const 成员方法。同理

 const Fred* p  表明  p  指向一个  const  的  Fred  对象——  Fred  对象不能通过  p  修改。
  Fred* const p  表明  p  是一个指向  Fred  对象的  const  指针——可以通过  p  修改  Fred  对象,但不能修改  p  本身。
  cosnt Fred* const p  表明“  p  是一个指向  const Fred  对象的  const  指针”——不能修改  p  ,也不能通过  p  修改  Fred  对象。
18.6 “  const Fred& x  ”是什么意思?

mutable和 const_cast方法

如果 const 方法也想要改变成员属性, 这个属性必须是 mutable 的, 但是由于不是所有的编译器都支持mutable 这个关键字, 所以最好不要使用。

const_cast


const成员函数, 就是在参数列表之后增加一个const限定, 该成员函数可以由const对象和 非const对象调用,该成员函数确保不会修改成员属性。

const对象只能调用const成员函数, 不能调用非const成员函数。

你可能感兴趣的:(const正确性)