当前位置:首页 > 分校动态 > 计算机考证

2020年计算机等级考试二级C++辅导笔记:重载双目运算符

来源:长理培训发布时间:2020-09-29 20:38:20
  一。作为类成员函数的重载
  为了能进行类对象和一个整型值的加法运算,需要写一个类的成员函数来重载双目加法(+)运算符。该函数在类中的声明如下:
  Date operator + (int) const;
  函数的声明指出,返回值是一个Date类对象,函数名是运算符+,只有一个整型参数,而且函数是常量型的。当编译器发现某个函数以加上前缀operator的真实运算符作为函数名,就会把该函数当作重载运算符函数来处理。如果在表达式中,该运算符的左边是一个类对象,右边是一个参数类型的一个对象,那么重载运算符函数就会被调用。调用形式如下:
  Date dt(6,9,2005);
  dt=dt+100;
  也可以显式的调用重载运算符函数:
  dt.operator + (100);
  下面代码重载了双目加法运算符来计算一个整数和一个Date类对象之和,并且返回Date类对象。
  #include iostream.h
  class Date
  {
  int mo,da,yr;
  static int dys[];
  public:
  Date(int m=0,int d=0,int y=0)
  { mo=m; da=d; yr=y;}
  void display() const
  { cout< Date operator + (int) const;
  };
  int Date::dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
  Date Date::operator+(int) const
  {
  Date dt=*this;
  n+=dt.da;
  while(n>=dys[dt.mo-1])
  {
  n-=dys[dt.mo-1];
  if(++dt.da==13)
  {
  dt.mo=1;
  dt,yr++;
  }
  }
  dt.da=n;
  return dt;
  }
  int main()
  {
  Date olddate(1,1,2005);
  Date newdate;
  newdate=olddate+100;
  newdate.display();
  return 0;
  }
  二。非类成员的运算符重载
  在重载运算符的原则中说到,要保持运算符的可交换性。而上面的程序只允许Date类对象在运算符的左边而整型值在右边,不支持下面的语句:
  Date newdate=100+olddate;
  所以,仅仅靠一个类的成员重载运算符是无法实现上面功能的。对重载双目运算符的类成员函数来说,总是认定调用函数的对象位于运算符左边。不过,我们可以再写一个非类成员的重载运算符函数,可以规定Date类的对象在运算符右边,而别的类型在运算符左边。例如,我们可以这样在类的外部定义一个函数:
  Date operator + (int n,Date& dt)
  下面代码在原先的基础上增加了一个非类成员函数来实现双目加法运算符的重载。
  #include iostream.h
  class Date
  {
  int mo,da,yr;
  static int dys[];
  public:
  Date(int m=0,int d=0,int y=0)
  { mo=m; da=d; yr=y;}
  void display() const
  { cout< Date operator + (int) const;
  };
  int Date::dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
  Date Date::operator+(int) const
  {
  Date dt=*this;
  n+=dt.da;
  while(n>=dys[dt.mo-1])
  {
  n-=dys[dt.mo-1];
  if(++dt.da==13)
  {
  dt.mo=1;
  dt,yr++;
  }
  }
  dt.da=n;
  return dt;
  }
  Date operator + (int n,Date& dt)
  {
  return dt+n;
  }
  int main()
  {
  Date olddate(1,1,2005);
  Date newdate;
  newdate=olddate+100;
  newdate.display();
  return 0;
  }
  上面的例子中非类成员重载运算符函数调用了类中的重载+运算符来实现加法运算。如果类当中没有提供这样的函数,那么非类成员的重载运算符函数将被迫访问类的私有数据来实现加法运算。这样的话,需要把这个函数声明为类的友元,如下:
  class Date
  {
  friend Date operator + (int n,Date&);
  };
  上例中重载运算符函数声明了全部两个参数,这是因为它不是类的成员,因此它不能作为类的成员函数被调用,就缺少了一个隐含的参数。
  个重载加法运算符函数也可以用类的友元函数来实现。作为一种约定,这通常把所有为类重载的运算符都设定为该类的友元。
  例子中只给出了重载加法的代码,我们同样可以来重载减法,乘除法等等。

责编:胡梦瑶

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)
返回顶部