
- •Часть II Объектно-ориентированное проектирование Конспект лекций
- •Процесс разработки пп
- •Пример ооПр (объектно-ориентированного проектирования)
- •Определение объектно-ориентированного языка программирования (оояп)
- •Разработка класса в ооп.
- •Уровни видимости
- •Методы класса
- •Конструкторы и деструктор
- •Объявление методов класса
- •Реализация класса: общие положения
- •Определение конструкторов: примеры
- •Определение методов класса
- •Использование класса
- •Примеры использования класса
- •Перегрузка функций
- •Перегрузка операций
- •Выбор функции
- •Друзья класса
- •Друзья или члены
- •Преобразования типа
Реализация класса: общие положения
Определения функций-членов класса обычно размещаются вне класса и следуют обычным правилам языка С, за одним исключением: в начале возможно указание ключевого слова inline, определяющее встроенную функцию (правила вызова встроенных функций; определение inline-функций должны размещаться в файлах-заголовках, тогда как определения обычных функций - в обычных файлах):
[inline] тип_возвращаемого_значения имя_функции_члена_класса (тип параметр1, ...)
{
. . . // тело функции
}
Ограничения на использование inline-функций.
Определения функций могут быть включены в определение класса - тогда получаем всегда и только inline-функции, поэтому внутри класса ключевое слово inline не кодируется.
В С++ можно любую функцию, не обязательно член класса, сделать inline-функцией.
Две особенности функций-членов: как задается имя функции и как осуществляется доступ к состоянию класса.
Задание имени функции-члена класса: имя функции-члена класса содержит в себе информацию о том классе, в котором эта функция (метод) определена. Функция-член класса не существует вне класса и без класса. Поэтому в задании имени функции-члена класса используются имя класса и операция разрешения видимости:
имя_класса :: имя_функции
При вызове функции (посылке сообщения адресату) указывается только имя_функции; имя_класса определяется типом адресата:
адресат.имя_функции(список_аргументов)
Обращение к членам класса: при реализации функций-членов класса необходимо обращаться к членам класса - данным и функциям. Для этого служит полное квалификационное имя: имя_класса::имя_члена_класса (здесь может быть указано имя и члена-данного, и функции-члена класса).
Внутри функций-членов класса определен специальный неявный параметр this - имеет тип “указатель на данный класс”; его значение определяет адресата - адрес конкретного экземпляра класса, которому посылается соответствующее сообщение (или для которого вызывается соответствующая функция-член класса). Возможен доступ к членам класса по этому указателю: this->имя_члена_класса.
Если нет никаких неясностей и неопределенностей, имя_класса и/или this-> могут быть опущены.
Определение конструкторов: примеры
Реализация конструкторов класса Rational, определенного ранее.
class Rational{
private:
int num, den;
int gcd(); // Нахождение наибольшего общего делителя
void reduce(); // Сокращение дроби
void correct(); // Корректировка значения дроби (так чтобы всегда было den > 0 )
protected:
public:
/* Конструкторы класса */
Rational(){num = 0; den = 1; }
Rational(int num){Rational::num = num; den = 1; }
Rational(int num, int den) {num = n; den = d; correct(); }
/* Второй вариант - с использованием параметров по умолчанию */
Rational(int num, int den = 1) {num = n; den = d; correct(); }
/* Деструктор класса */
~Rational(){}
/* Методы класса: селекторы */
void print();
Rational add(const Rational &opd);
/* Модификатор */
void assign(int x, int y);
};
Инициализирующие конструкторы обычно небольшие по размерам, поэтому их определение обычно включается в определение класса. Определение методов класса также можно включить в определение класса, если оно не велико. Но лучше вынести за пределы класса, используя при необходимости спецификатор inline.