C++ 一元运算符重载

一元运算符只对一个操作数进行操作,下面是一元运算符的实例:

  • 递增运算符( ++ )和递减运算符( -- )
  • 一元减运算符,即负号( - )
  • 逻辑非运算符( ! )

一元运算符通常出现在它们所操作的对象的左边,比如 !obj-obj++obj,但有时它们也可以作为后缀,比如 obj++obj--

下面的实例演示了如何重载一元减运算符( - )。

      #include <iostream>
      using namespace std;

      class Distance
      {
         private:
            int feet;             // 0 到无穷
            int inches;           // 0 到 12
         public:
            // 所需的构造函数
            Distance(){
               feet = 0;
               inches = 0;
            }
            Distance(int f, int i){
               feet = f;
               inches = i;
            }
            // 显示距离的方法
            void displayDistance()
            {
               cout << "F: " << feet << " I:" << inches <<endl;
            }
            // 重载负运算符( - )
            Distance operator- ()  
            {
               feet = -feet;
               inches = -inches;
               return Distance(feet, inches);
            }
      };
      int main()
      {
         Distance D1(11, 10), D2(-5, 11);

         -D1;                     // 取相反数
         D1.displayDistance();    // 距离 D1

         -D2;                     // 取相反数
         D2.displayDistance();    // 距离 D2

         return 0;
      }

当上面的代码被编译和执行时,它会产生下列结果:

      F: -11 I:-10
      F: 5 I:-11

希望上面的实例能够帮您更好地理解一元运算符重载的概念,类似地,您可以尝试重载逻辑非运算符( )。

下面的实例演示了如何重载递增运算符( ++ ),包括前缀和后缀两种用法。类似地,您也可以尝试重载递减运算符( --

      #include <iostream>
      using namespace std;

      class Time
      {
         private:
            int hours;             // 0 到 23
            int minutes;           // 0 到 59
         public:
            // 所需的构造函数
            Time(){
               hours = 0;
               minutes = 0;
            }
            Time(int h, int m){
               hours = h;
               minutes = m;
            }
            // 显示时间的方法
            void displayTime()
            {
               cout << "H: " << hours << " M:" << minutes <<endl;
            }
            // 方法1: 重载前缀递增运算符( ++ )
            Time operator++ ()  
            {
               ++minutes;          // 对象加 1
               if(minutes >= 60)  
               {
                  ++hours;
                  minutes -= 60;
               }
               return Time(hours, minutes);
            }

            // 方法2: 重载前缀递增运算符( ++ )
            // 返回的是当前对象的引用,不需要调用拷贝构造函数再构造新对象
            Time& operator++()
            {
               ++minutes;                    
               if(minutes >= 60)
               {
                  ++hours;
                  minutes -= 60;
               }
               return *this;
            }

            // 方法1: 重载后缀递增运算符( ++ )
            Time operator++( int )         
            {
               // 保存原始值
               Time T(hours, minutes);
               // 对象加 1
               ++minutes;                    
               if(minutes >= 60)
               {
                  ++hours;
                  minutes -= 60;
               }
               // 返回旧的原始值
               return T; 
            }

            // 方法2: 重载后缀递增运算符( ++ )
            // 返回的是T对象的值
            Time operator++( int ) 
            {
               Time T(*this); // 调用类的拷贝构造函数
               ++minutes;                    
               if(minutes >= 60)
               {
                  ++hours;
                  minutes -= 60;
               }       
               return T; //必须返回其值,因为函数结束就销毁改对象了
            }
      };
      int main()
      {
         Time T1(11, 59), T2(10,40);

         ++T1;                    // T1 加 1
         T1.displayTime();        // 显示 T1
         ++T1;                    // T1 再加 1
         T1.displayTime();        // 显示 T1

         T2++;                    // T2 加 1
         T2.displayTime();        // 显示 T2
         T2++;                    // T2 再加 1
         T2.displayTime();        // 显示 T2
         return 0;
      }

当上面的代码被编译和执行时,它会产生下列结果:

      H: 12 M:0
      H: 12 M:1
      H: 10 M:41
      H: 10 M:42

🔚