• 运算符重载


    1、C++中的运算符重载

      用 operator 关键字申明运算符的重载。

      新建类 mCurPoint ,该类继承自 mCPoint。

      .h文件中申明类,及成员函数:

      class mCurPoint :public mCPoint

      {
      public:
        mCurPoint(void);
        mCurPoint(double x ,double y);
        ~mCurPoint(void);
      public:
        double getArea();
        double distancTo(mCurPoint oPt);
        mCurPoint operator- (const mCurPoint& p2) const;
       mCurPoint operator+ (const mCurPoint& p2) const;
      };

      如上,红色部分分别重载加号运算(+)和减号运算(-)。由于加号(+)和减号(-)是二元运算符,除本身(this 指针)之外还需要另外一个变量,因此还需要给函数增加一个参数 p2。

      运算结果需要有返回值(没有返回值也可以,不过就没有意义了),因此需要有返回值类型。这里是 mCurPoint  类型,也可以是其他类型,根据具体情况而定。

      

      在 .cpp 文件中定义实现函数(运算符重载部分):

      mCurPoint mCurPoint::operator- (const mCurPoint& p2) const
      {
        double x = p2.mpX - this->mpX;
        double y = p2.mpY - this->mpY;
        mCurPoint mPot (x,y);
        return mPot;
      }
      mCurPoint mCurPoint::operator+ (const mCurPoint& p2) const
      {
        double xx = (this->mpX + p2.mpX)/2;
        double yy = (this->mpY + p2.mpY)/2;
        mCurPoint mPot(xx,yy);
        return mPot;
      }

      在函数中,根据需要,但会符合实际的结果即可。

      重载运算符的使用

      mCurPoint pot(1,3);                              //定义pot
      mCurPoint pot2 (3,3);                             //定义第二个变量
      mCurPoint resPot = pot2 - pot;                        //计算结果
      cout<<"pot2 - pot :x="<<resPot.mpX<<"; y = " <<resPot.mpY<<endl;   //输出结果
      mCurPoint sumPot = pot2 + pot;
      cout<<"pot2 + po2 : x= "<<sumPot.mpX<<"; y = "<<sumPot.mpY<<endl;

      

    2、c#中的运算符重载

      和C++类似,定义一个类,使用 operator 关键字重载运算符。

      class ClsAppple
      {
        public double height;
        public double Radiuo;
        public string name;
        public static ClsAppple operator-(ClsAppple cl1,ClsAppple cl2)
        {
          ClsAppple newAp = new ClsAppple() { name = "NULL", height = cl1.height - cl2.height, Radiuo = cl1.Radiuo - cl2.Radiuo };
          return newAp;
        }
      }

      和C++不同的是,运算符减号(-)是二元操作符,所以需要在函数中传递两个参数。

      重载后,即可直接使用:

      ClsAppple cl1 = new ClsAppple()
      {
        Radiuo = 10,
        height = 0.5,
        name = "N1"
      };
      ClsAppple cl2 = new ClsAppple()
      {
        name = "N2",
        height = 2,
        Radiuo = 20
      };
      ClsAppple resApp = cl1 - cl2;
      string rsStr = String.Format("Res: R = {0}; H = {1}; N = {2}", resApp.Radiuo, resApp.height, resApp.name);

    自定义类一般不直接支持标准运算(如:+,-,*,/,+=,-=......等),使用运算符不仅可以使自定义类支持标准运算,还可以根据需要返回合适类型和值。不仅可以减少程序代码量,也大大增强了程序的可读性,同时也是面向对象中多态的体现。

  • 相关阅读:
    LeetCode 172:阶乘后的零
    Ubuntu12.04更新出现 The system is running in low-graphics mode解决方法
    不加参数的存储过程
    PCC-S-02201, Encountered the symbol "DB_USER_OPER_COUNT"
    该思考
    关于export环境变量生存期
    会话临时表 ORA-14452
    如何创建守护进程--及相关概念
    2014年10月末
    6个月
  • 原文地址:https://www.cnblogs.com/xtblog/p/5647117.html
Copyright © 2020-2023  润新知