Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП 1-3 лекции.docx
Скачиваний:
5
Добавлен:
18.11.2019
Размер:
55.63 Кб
Скачать
    1. Реализация класса: общие положения

Определения функций-членов класса обычно размещаются вне класса и следуют обычным правилам языка С, за одним исключением: в начале возможно указание ключевого слова inline, определяющее встроенную функцию (правила вызова встроенных функций; определение inline-функций должны размещаться в файлах-заголовках, тогда как определения обычных функций - в обычных файлах):

[inline] тип_возвращаемого_значения имя_функции_члена_класса (тип параметр1, ...)

{

. . . // тело функции

}

Ограничения на использование inline-функций.

Определения функций могут быть включены в определение класса - тогда получаем всегда и только inline-функции, поэтому внутри класса ключевое слово inline не кодируется.

В С++ можно любую функцию, не обязательно член класса, сделать inline-функцией.

Две особенности функций-членов: как задается имя функции и как осуществляется доступ к состоянию класса.

  1. Задание имени функции-члена класса: имя функции-члена класса содержит в себе информацию о том классе, в котором эта функция (метод) определена. Функция-член класса не существует вне класса и без класса. Поэтому в задании имени функции-члена класса используются имя класса и операция разрешения видимости:

имя_класса :: имя_функции

При вызове функции (посылке сообщения адресату) указывается только имя_функции; имя_класса определяется типом адресата:

адресат.имя_функции(список_аргументов)

  1. Обращение к членам класса: при реализации функций-членов класса необходимо обращаться к членам класса - данным и функциям. Для этого служит полное квалификационное имя: имя_класса::имя_члена_класса (здесь может быть указано имя и члена-данного, и функции-члена класса).

Внутри функций-членов класса определен специальный неявный параметр this - имеет тип “указатель на данный класс”; его значение определяет адресата - адрес конкретного экземпляра класса, которому посылается соответствующее сообщение (или для которого вызывается соответствующая функция-член класса). Возможен доступ к членам класса по этому указателю: this->имя_члена_класса.

Если нет никаких неясностей и неопределенностей, имя_класса и/или this-> могут быть опущены.

    1. Определение конструкторов: примеры

Реализация конструкторов класса 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.