zoukankan      html  css  js  c++  java
  • const 和非 const 函数重载

    转载自:http://zhidao.baidu.com/question/55437904.html

    class a
    {
    public:
    int x()
    {......}
    int x() const
    {......}
    };

    这样的 const 重载是允许的 但是什么时候会调用 x()
    什么时候会调用 x() const ? 他们又有什么不同呢?


    const a a1;
    a a2;
    a1.x();
    a2.x();


    a1调用const版本,a2调用非const版本。


    后面加const表示在该函数中不能对类的数据成员进行改变,
    比如:


    class A
    {
    private:
     int aa;
    public:
     int x()
    {
     return aa++;
    } //这可以
    int x() const
    {
    return aa++;//这错误
    }
    };
    当然有特殊情况,就是用mutable关键字修饰过的成员变量可以在声明为const 函数中被改变。
    关于mutable:


    关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员
      我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,
      对像的状态也会随之发生变化! 
      如果一个类的成员函数被声明为 const 类型,表示该函数不会改变对象的状态,也就是
      该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员
      进行赋值.这个时候就需要用到 mutable 关键字了


      例如:
       class Demo
      {
      public:
      Demo(){}
      ~Demo(){}
      public:
      bool getFlag() const
      {
      m_nAccess++;
      return m_bFlag;
      }
      private:
      int m_nAccess;
      bool m_bFlag;
      }; 
      int main()
      {
      return 0;
      }
     




      编译上面的代码会出现 error C2166: l-value specifies const object的错误
      说明在 const 类型的函数中改变了类的非静态数据成员.


      这个时候需要使用 mutable 来修饰一下要在 const 成员函数中改变的非静态数据成员
      m_nAccess,代码如下:


       class Demo
      {
      public:
      Demo(){}
      ~Demo(){}
      public:
      bool getFlag() const
      {
      m_nAccess++;
      return m_bFlag;
      }
      private:
      mutable int m_nAccess;
      bool m_bFlag;
      }; 
      int main()
      {
      return 0;
      }
     
      这样再重新编译的时候就不会出现错误了!

  • 相关阅读:
    JasperReport html 导出
    mysql 序列号生成器 (自定义函数)
    [Java][Spring]Spring事务不起作用 问题汇总
    序列 mysql
    订单编号
    Mybatis
    SNMP 配置
    Gradle 1.12用户指南翻译——第三十八章. Eclipse 插件
    cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结
    Android实战简易教程-第二十八枪(Uri转String型实例)
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212066.html
Copyright © 2011-2022 走看看