-Рубрики

 -Музыка

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в TheLenka

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 03.01.2009
Записей:
Комментариев:
Написано: 265


Перегрузка операторов

Среда, 24 Июня 2009 г. 16:22 + в цитатник



В системе заложены определенные  алгоритмы для интерпретации таких операторов, как (+), (-) и т.д. Так, например, для типов 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
}

 


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку