Раздел «Образование».FIVTLecturesTerm2Lecture01:
<<Лекции ФИВТ, 2-й семестр

Лекция 1. Основы ООП. Класс Figure. Класс Date

ООП — Объектно Ориентированное Программирование.

Определение ООП

Объект - это программная единица, включающая в себя некоторые данные (как структура в языке C) и предоставляющая методы для работы с этими данными. Тип объекта называется классом.

Например, дату (тройку год, месяц, день) можно расматривать как класс. Дадим этому классу имя Date. Конкретная тройка называется объектом класса Date.

Кроме задачи содержания трёх полей (инкапсулирования) YYYY, MM, DD объект класса Date может уметь кое-что делать типичные для дат действия, например:

ОО Программист — это программист, который при разработке программы мыслит в терминах объектов, (вложенных друг в друга, и ссылающихся друг на друга), действий над объектами, передачи сообщений от объекта объекту и делит программный код на части, определяющие отдельные классы — "родовые виды" объектов.

Между классами возможно отношение наследования. Например класс Квадрат может наследовать от класса Фигура.

Пример иерархии наследования:

С сокращениями соответствующий код выглядит так:

class Figure {
   virtual void draw() const;
   virtual bool operator ===(const Figure &f) const;
};

class FigureWithArea : Figure {
   virtual double get_area() const;
};

class Circle : FigureWithArea {
   Point get_center();
   double get_radius();
};

class Square : FigureWithArea {
   Point get_center();
   double get_side();
   double get_angle()
};

class CountureFigure : Figure {

}

Не все конструкции здесь ясны. Поясним коротко некоторые из них:

Определение класса Date

class Date {
private:
  // Внутренние сокрытые данные, недоступные "снаружи" для записи.
  // Для их чтения созданные методы доступа get_*, которые
  // назваются методами аксессорами (accessors).
  int day, month, year;

public:
  // конструктор
  // не должен позволять создавать даты с некоректными данными
  Date(int day, int month, int year);

  // деструктор
  ~Date();

  // доступ к аттрибутам
  int getDay();
  int getMonth();
  int getYear();

  // Возвращает true в случае успеха
  bool setDate(int day, int month, int year);

  // Возвращает количество дней между датами
  int operator -(const Date &days);

  // Возвращает новую смещённую дату
  Date operator +(const int &days);

  // Смещает дату на заданное количество дней
  Date& operator +=(const int &days);

  friend ostream& operator <<(ostream &, const Date&);
  friend istream& operator >>(istream &, Date&);
};

class Date {
private:

  int day, month, year;

public:
  
  Date(int day, int month, int year): 
    day(day), month(month), year(year) {
  };
      
  ~Date() {};

  int get_day() {
    return day;
  }
  
  int get_month() {
    return month;
  }
  
  int get_year() {
    return year;
  }
};

Добавим проверку корректности (неполную проверку). Для этого нужно определить типы ошибок. Тип ошибки — это тоже класс, который обычно определяют внутри того класса, в чьих методах эта ошибка возникает.

class Date {
private:
  int day, month, year;

  bool is_valid() const {
    return day > 0 && 
        month > 0 && 
        year > 0 && 
        day <= 31 && 
        month <= 12; 
  }
public:
  
  // вложенный класс ошибки
  class WrongDateException {
  public:
    WrongDateException(){}
  }

  Date(int day, int month, int year): 
    day(day), month(month), year(year) {
    if (! is_valid() ) {
      throw WrongDateException();
    }
  };
      
  ~Date() {};

  int get_day() {
    return day;
  }
  
  int get_month() {
    return month;
  }
  
  int get_year() {
    return year;
  }
};

Два подхода к созданию объектов. Операторы new и delete

Операторы new и delete. Когда вызываются конструкторы и деструктор.

-- ArtemVoroztsov - 30 Mar 2010