Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

3.2.3 Первые примеры

В качестве самого первого примера приведём класс для работы с комплексными числами. Правда, в стандартной библиотеке С++ уже реализован шаблонный тип complex (для его использования нужно подключить заголовочный файл <complex>), который предоставляет полный набор операций с комплексными числами. Так что пример опять носит чисто учебный характер. Мы и назовём класс немного иначе − complex_t , и не будем стремиться к реализации всех методов для работы с комплексными числами.

В качестве первого примера класс хорош тем, что выделение полей не составляет никакого труда – это действительная (re) и мнимая (im) части комплексного числа. И в защите они не нуждаются, поскольку могут принимать любое действительное значение. Поэтому, пожалуй, оформим класс в виде структуры, содержащей только открытые элементы. Методы в класс будем добавлять по мере дальнейшего изложения – пока пусть будут самые простые.

// Пример 3.1 – реализация структуры "комплексное число"

#include <iostream>

struct complex_t

{ // Все элементы public по умолчанию

double re, im;

void show() const; // вывод комплексного числа

// задание значений для re и im

void set(double _re, double _im);

}; // про точку с запятой в конце не забыли

// реализация методов

void complex_t :: show() const { // "::" означает принадлежность классу

std::cout<<re<<"+i*"<<im<<std::endl;

}

void complex_t :: set(double _re, double _im) {

re=_re; im=_im;

}

int main() { // демонстрация структуры complex_t

complex_t a, b; complex_t *p=new complex_t;

a.set(1,1); a.show(); // задали значения через метод set

// а теперь обратились напрямую к полям

b.re=2; b.im=-3; b.show();

p->set(4,8); p->show(); // используем указатели

}

Следующий пример, тоже простой, демонстрирует защиту полей. На этот раз реализуем класс "Отрезок времени" (назовём его time_range), который содержит в качестве полей часы и минуты. На этот раз поля требуют защиты, поскольку значение минут не должно превышать 59. Будем считать, что мы реализуем просто отрезок времени (не время суток!), поэтому значение часов не будем приводить к отрезку [0,23], но и это поле нуждается в защите.

// пример 1.3.2 - реализация класса "отрезок времени"

#include <iostream>

class time_range {

private:

unsigned int hour, minute;

public:

void set (unsigned int _hour, unsigned int _minute);

void show () const; // вывод отрезка времени

};

void time_range::set (unsigned int _hour, unsigned int _minute) {

hour = _hour; minute = _minute;

if (minute > 59) { // исправляем недопустимые значения минут

hour += minute / 60;

minute %= 60;

}

}

void time_range::show() const {

std::cout << hour << ":" << minute << std::endl;

}

int main() {

time_range t;

t.set(1, 75);

t.show();

}

При обнаружении некорректного значения минут (больше 59) метод set автоматически корректирует время. Возможны и другие варианты обработки этой ситуации, в данном случае мы исходили из того, что и некоторые функции стандартной библиотеки С++ при некорректных данных могут возвратить результат, исправив исходные данные. Обработка исключительных ситуаций будет подробно рассмотрена в следующей главе.

Отметим, что оба класса, представленные в качестве примеров, пока очень несовершенны. Будем постепенно улучшать их качество, осваивая новые понятия ООП. Первым делом добавим конструкторы и деструкторы.