4.0 C++遠征:リロード演算子

4254 ワード

リロード演算子
[TOC]
四、リロード演算子
:
:
: operator
1.一元演算子の再ロード

I-(マイナス記号)の重荷重(逆を取りましょう)
  • 友元関数リロード
    // Coordinate.hpp
    class Coordinate {  
      friend Coordinate& operator-(Coordinate &coor);
      public:
        Coordinate(int x, int y);
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    Coordinate& Coordinate::operator-(Coordinate &coor) {
      coor.m_iX = -coor.m_iX;
      coor.m_iY = -coor.m_iY;
      return *this;
    }
    
    // main.cpp
    int main() {
      Coordinate coor(3, 5);
      -coor;    // operator-(coor);
      
      return 0;
    }
    
  • メンバー関数リロード
    // Coordinate.hpp
    class Coordinate {
      public:
        Coordinate(int x, int y);
        Coordinate& operator-();    //  this  
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    Coordinate& Coordinate::operator-() {
      m_iX = -m_iX;
      m_iY = -m_iY;
      return *this;
    }
    
    // main.cpp
    int main() {
      Coordinate coor(3, 5);
      -coor;    // coor.operator-();
      
      return 0;
    }
    
  • Ⅱ++記号のリロード
  • 前置++符号リロード
    // Coordinate.hpp
    class Coordinate {
      public:
        Coordinate(int x, int y);
        Coordinate& operator++();   //   ++
      private:
        int m_iX;
        int m_iY;
    };
        
    // Coordinate.cpp
    Coordinate& Coordinate::operator++() {
      m_iX++;
      m_iY++;
      return *this;
    }
        
    // main.cpp
    int main() {
      Coordinate coor(3, 5);
      ++coor;   // coor.operator++();
          
      return 0;
    }
    
  • 後置++符号リロード
    // Coordinate.hpp
    class Coordinate {
      public:
        Coordinate(int x, int y);
        Coordinate operator++(int); //   ++(int       ++     ,        )
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    Coordinate Coordinate::operator++(int) {
      Coordinate oldCoor(*this);
      m_iX++;
      m_iY++;
      return oldCoor;
    }
    
    // main.cpp
    int main() {
      Coordinate coor(3, 5);
      coor++;   // coor.operator++(0);
          
      return 0;
    }
    
  • 2.二元演算子の再ロード

    I+(プラス記号)のリロード
  • 友元関数リロード
    // Coordinate.hpp
    class Coordinate {
      friend Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2);
      public:
        Coordinate(int x, int y);
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2) {
      Coordinate tempCoor;
      tempCoor.m_iX = coor1.m_iX + coor2.m_iX;
      tempCoor.m_iY = coor1.m_iY + coor2.m_iY;
      return tempCoor;
    }
    
    // main.cpp
    int main() {
      Coordinate coor1(3, 5);
      Coordinate coor2(4, 6);
      Coordinate coor3(0, 0);
      coor3 = coor1 + coor2;    // coor3 = operator+(coor1, coor2);
      
      return 0;
    }
    
  • メンバー関数リロード
    // Coordinate.hpp
    class Coordinate {
      public:
        Coordinate(int x, int y);
        Coordinate operator+(const Coordinate &coor);
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    Coordinate operator+(const Coordinate &coor) {
      Coordinate tempCoor;
      tempCoor.m_iX = this->m_iX + coor.m_iX;
      tempCoor.m_iY = this->m_iY + coor.m_iY;
      return tempCoor;
    }
    
    // main.cpp
    int main() {
      Coordinate coor1(3, 5);
      Coordinate coor2(4, 6);
      Coordinate coor3(0, 0);
      coor3 = coor1 + coor2;    // coor3 = coor1.operator+(coor2);
      
      return 0;
    }
    
  • Ⅱ <
  • 友元関数リロード
    // Coordinate.hpp
    #include 
    using namespace std;
    class Coordinate {
      friend ostream &operator<
  • 出力演算子はメンバー関数で再ロードできますか?いけません.リロード出力演算子の最初のパラメータはostream&outでなければならないので、メンバー関数として書く場合はthisポインタでなければなりません.

  • III[](インデックス)のリロード
    // Coordinate.hpp
    class Coordinate {
      public:
        Coordinate(int x, int y);  
        int operator[](int index);
      private:
        int m_iX;
        int m_iY;
    };
    
    // Coordinate.cpp
    int operator[](int index) {
      if(index == 0)
        return m_iX;
      if(index == 1)
        return m_iY;
    }
    
    // main.cpp
    int main() {
      Coordinate coor(3, 5);
      
      cout << coor[0];  // coor.operator[](0);
      cout << coor[1];  // coor.operator[](1);
      
      return 0;
    }
    
  • インデックス演算子は友元関数で再ロードできますか?いけません.インデックス演算子の最初のパラメータはthisポインタでなければなりません.