Перегрузка операторов |
В системе заложены определенные алгоритмы для интерпретации таких операторов, как (+), (-) и т.д. Так, например, для типов int запускается алгоритм сложения целочисленных значений, а для типов float запускается алгоритм сложения для типов с плавающей точкой. Эти операции могут быть перегружены для объектов классов, т. е. есть возможность, для объектов определенных классов описать свои алгоритмы сложения, вычитания и т.д. Для перегрузки, используется ключевое слово operator, указывается оператор, который перегружается, и объект, который будет находится справа от оператора. Пример:
class Currency
{
public:
int dollars, cents;
Currency():dollars(0),cents(0) {}
Currency(int nd,int nc): dollars(nd),cents(nc) {}
Currency operator+ (Currency c)
{
c.dollars=this->dollars+c.dollars+int((this->cents+c.cents)/100);
c.cents=(this->cents+c.cents) % 100;
return c;
}
void Show()
{
cout<<"$"<<this->dollars<<"."<<this->cents<<endl;
}
};
void main()
{
Currency c1(1,20);
Currency c2(3,95);
Currency c3;
c3=c1+c2;
c3.Show(); //$5.15
}
В классе Currency(валюта), необходима перегрузка оператора, т. к. при увеличении на каждые 100 центов, мы должны добавить один доллар, и доллары при этом складывать тоже. В нашем случае, на выходе, мы получаем объект, который копируется в объект c3. Мы можем описать метод перегрузки по-другому, например таким образом, что он будет возвращать итоговое количество центов.
int operator+ (Currency c)
{
return this->dollars*100+c.dollars*100+thg-¬>cents+c.cents;
}
void main()
{
Currency c1(1,20);
Currency c2(3,95);
int cents;
cents=c1+c2;
cout<<cents<<" cents"<<endl; //515 cents
}
Посмотрим, как перегрузка может облегчить нам жизнь при работе со строками.
#include <string.h>
using namespace std;
class MyString
{
protected:
char *s;
public:
MyString ():s(new char('\0')) {}
void operator= (char *ns)
{
this->s=new char[strlen(ns)];
strcpy(s,ns);
}
char* operator+ (char *ns)
{
char *temp=new char[strlen(s)+strlen(ns)];
strcpy(temp,this->s);
strcat(temp,ns);
return temp;
}
char* operator+ (MyString ns)
{
char *temp=new char[strlen(s)+strlen(ns.s)];
strcpy(temp,this->s);
strcat(temp,ns.s);
return temp;
}
void operator<< (char *ns)
{
cout<<this->s<<" "<<ns;}
void Show()
{
cout<<s<<endl;
}
};
void main()
{
MyString st;
st="Hello";
st.Show(); //Hello
cout<<st+" paradise"<<endl;
st.Show(); //Hello paradise (не меняет сам объект)
st=st+" paradise is lost";
st.Show(); //Hello paradise is lost (меняется сам объект)
st<<"Allright\n"; //Hello paradise is lost Allright
MyString st1;
st1=" It's no good";
st1=st+st1;
st1.Show(); //Hello paradise lost It's no good
}
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |