运算符重载

Time类为例
class Time{
  private:
    int hours;
    int minutes;
  Time operator +(const Time &t)const;
  Time operator -(const Time &t) const;
  Time operator *(double mult) const;
  friend Time operator *(double m,const Time &t);//利用友元函数重载运算符
  friend ostream & operator <<(ostream &out,Time & t);//利用友元函数重载输出流
}

Time Time::operator+(const Time &t)const{
  Time sum;
  sum.minutes=minutes+t.minutes;
  sum.hours=hours +t.hours+sum.minutes/60;
  sum.minutes%=60;
  return sum;
}

Time Time::operator -(const Time &t) const{
  Time diff;
  int tot1,tot2;
tot1=t.minutes+60*t.hours;
tot2=minutes+60*hours;
diff.minutes=(tot2-tot1)%60;
diff.hours=(tot2-tot1)/60;
 return diff;
}

 Time Time::operator *(double mult) const{
  Time result;
  long totalminutes=hours*60*mult+minutes*mult;
  result.minutes=totalminutes%60;
  result.hours=totalminutes/60;
  return result;
}

Time operator *(double m,const Time &t){
  return t*m;
};

ostream & operator <<(ostream &out,Time & t){
  out<<"hour:"<<t.hours<<"minute:"<<t.minutes<<endl;
  return out;
}

Vector operator -() const;//单目运算符重载,取反运算符
Vector Vector::operator-()const{
  return Vector(-x,-y);
}

2.类型转换函数
Stonewt wolfe(285.7);//一个Stonewt类实例
double host=double(wolfe);//将Stonewt类转换为double
double thinker=(double)wolfe;//同上
实现上述操作需定义类型转换函数
operator typeName();
如:operator double() const;
如:operator int();
//1.类型转换函数必须是类的方法
//2.没有return类型
//3.没有参数
3.类型转换函数应用时的二义性
Stonewt poppins(9.2.8);//建立一个Stonewt的对象,假设实现了double和int两种类型转换函数
cout<<poppins<<endl;//错误,无法确定调用哪种类型转换函数
long gone=poppins;//理由同上
如果删除int类型转换函数,上述操作就可以进行,因为没有二义性。
long gone=(double)poppins;//显式调用double类型转换函数。
long gone=int(poppins);//显式调用int类型转换函数
4.C++11可以规定必须显式调用类型转换函数
explicit operator double()const;
explicit operator int()const;

括号运算符[]的重载
char city[40]="Amsterdam";
city[0];
city:左操作数
0:右操作数
char & String::operator [](int i){
  return str[i];
}
1.返回引用类型可以实现赋值运算
city[0]='r'; 
2.针对const对象的重载
const char & String::operator[](int i)const{
  return str[i];
}

posted @ 2024-08-02 15:07  zhongta  阅读(22)  评论(0)    收藏  举报