Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-50_1.docx
Скачиваний:
9
Добавлен:
02.08.2019
Размер:
707.62 Кб
Скачать
  1. Указатель this и перегрузка методов.

Рассмотрим на примере: Tmoney Tmoney::AddMoney (const Tmoney &b)

{Tmoney a = *th; s; // локальному параметру а присвоим значение текущего объекта;

a.summa+=b.summa; // сложим с суммой объекта параметр а;

return a;}

С помощью указателя this инициализировали локальную переменную а текущим объектом, т.е. тем объектом, для которого этот метод будет вызван (присвоим полям локального объекта значения полей текущего объекта).

Ключевое слово this – указатель на объект для которого вызван метод, т.о. метод получает дополнительный неявный параметр - указатель на текущий объект, который используется для обращения к полям объекта так: this → summa.

Один из основных принципов ООП — полиморфизм, а его принцип — переопределение функций — перегрузка. Методы этой функции — члены класса и они могут перегружаться. Рассмотрим на примере AddMoney: определим с этим же именем метод суммирования денег с числом, где число денежная сумма — константа.

Tmoney Tmoney::AddMoney (const double &b)

{Tmoney a; // объявим локальный объект;

a.Init (b); // инициализируем локальный объект формальным параметром;

return a.AddMoney (*this);} // сложим с суммой текущего объекта и возвратим его в качестве результата.

Возврат результата суммирования можно реализовать так:

return (*this).AddMoney(a);

  1. Использование классов, различные способы инициализации.

Принципы различный способов реализации:

typedef unsigned int, tint;

class Tmoney {public: // чтобы можно было использовать cout<<t.summa;

double summa;

double round (const double &r)

{double t = fabs(r);

t = (t – floor(t) < 0.5)? floor(t): cell(t);

return (r<0)? -t: t;};

void init (const doudle &t) // метод инициализации: Void Tmoney::Init (const double &t)

{summa = round (t*100);}

int main {char c1;

Tmoney t, p, s, z;

t.Init (100.55); p.Init (1000.66); // инициализация методом (t.summa = 100.55;)

Tmoney x = t; // инициализация другой переменной (x.summa = t.summa);

cout<<s.summa<<”/t”<<p.summa<<”/t”;

s.Init (0.0); z.Init (0.0); // обнуление s.summa = 0.0 и z.summa = 0.0;

cout<<x.summa<<”t”<<s.summa<<”t”<z.summa<<”t”;

c1 = cin.get(); return 0;}.

Пример 2:

int main()

{Tmoney t, p, s, z;

t.Init (100.55); p.Init (100.66); Tmoney x = t;

z = t.AddMoney(p); // z.summa = t.summa + p.summa;

z.DisplayMoney();

s.Init (0.0); z.Init (0.0); // обнуление s.summa и z.summa;

s = t.AddMoney(p);

s.DisplayMoney();

t.AddMoney(p).DisplayMoney(); // суммирование и вывод s.summa + p.summa;

s = t.DivByNum(2); s.DisplayMoney();

z = p.MultByNum(3.15); z.DisplayMoney();

s.ReadMoney(); s.DisplayMoney();

double d = p.DivMoney(s);

cout<<d<<endl; return 0;}

Наш метод инициализации не позволяет определить поля объекта Tmoney обычным образом

(Tmoney u = 250.00). Это будет возможно, если в определении класса ввести описание специального метода — конструктора.

Рассмотрим еще вариант метода инициализации:

Tmoney Tmoney::Init (const double &t)

{summa = round (t*100);

return *this;}

Кроме этих методов инициализации можно записать:

Tmoney t= z.Init (200.00); // инициализация 2-х объектов: z и t;

Это значит, что остается правильной конструкция t.Init (200.00)

Операторы t.AddMoney(p).DisplayMoney() работает так: вычисляется сумма полей объектов p и t (создается временный объект) и сразу выводятся на экран.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]