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

    在下面的代码中a1调用const版本,a2调用非const版本。
    
    const a a1;
    a a2;
    a1.x();
    a2.x();
    
    后面加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;
      }
     这样再重新编译的时候就不会出现错误了!
    
    

    再看为String类实现的[]操作符重载函数:

    char& operator[](int posion)    // function_1
     {
          return data[posion];
     };
    注意,这里该函数的返回值为一个引用,否则str[0] = 'c'这样的语句就会不合法,因为str[0]将是一个左值。

    那么,是否提供这样一个function_1就足够了呢?看下面这段代码: const String str= "She"; char c = str[0]; // 错误!编译提示:error C2678: 二进制“[” : 没有找到接受“const String”类型的左操作数的运算符(或没有可接受的转换)

    很显然,我们必须还要为const String提供一个const版本的opeartor[]。如下: char& operator[](int posion) const { return data[posion]; } 这样,当使用const的String对象使用[]操作符时,便会调用该const的重载版本。 但是,这样就OK了嘛?虽然上面的那段代码没有问题了,但是其中却隐藏了一个陷阱,看如下代码: const String str = "She"; str[0] = 'T'; 上面这段代码可以编译,运行通过,str变为了"The"!而str声明为const的!!

    现在,你应该知道了,对于const的该操作符重载函数其返回值也应该是const的,否则就会出现可以通过其修改const对象的漏洞。修改如下: const char& operator[](int posion) const { return data[posion]; } 好了,现在没有问题了!

    我们再回过头来看一下,为了给String提供一个[]操作符来读写指定位置的字符,需要提供如下两个函数,以分别对非const String对象和const String对象提供支持: char& operator[](int posion) { return data[posion]; };

    const char& operator[](int posion) const { return data[posion]; }

  • 相关阅读:
    *HDU 1392 计算几何
    *HDU 1115 计算几何
    *HDU 1086 计算几何
    *HDU 2108 计算几何
    HDU 1528 贪心模拟/二分图
    HDU 1281 二分图
    *HDU1150 二分图
    *HDU1151 二分图
    *HDU 1068 二分图
    *HDU 1054 二分图
  • 原文地址:https://www.cnblogs.com/lidan/p/2239512.html
Copyright © 2011-2022 走看看