美文网首页
const正确性

const正确性

作者: 董成鹏 | 来源:发表于2022-10-12 20:03 被阅读0次

    对于 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正确性

          本文链接:https://www.haomeiwen.com/subject/hatrartx.html