Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по ОООП.DOC
Скачиваний:
61
Добавлен:
10.05.2014
Размер:
358.91 Кб
Скачать

2.5. Реализация класса

Реализация класса предполагает разработку и написание на языке всех функций – методов класса. Каждая функция должна быть определена (и только один раз). Определение функции имеет обычный вид:

тип_результата имя_функции(тип пар1,) // заголовок функции

{

тело_функции

}

Функцию можно определить со спецификатором inline. Такие функции называютсявстроенными:

inline тип_результата имя_функции(тип пар1,)

{

тело_функции

}

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

Рис. 2-7. Использование обычных и встроенных функций

Пока мы рассматриваем реализацию функций-членов класса. Как указывалось ранее, функции-члены класса являются неотъемлемой частью класса и не существуют вне класса. Так как различные классы могут иметь функции-члены с одинаковыми именами, при определении функции-члена класса необходимо указать имя этого класса (здесь используется специальный оператор языка – оператор разрешения видимости ::); в результате определение функции-члена класса будет иметь вид:

тип_результата имя_класса::имя_функции(тип пар1,)

{

тело_функции

}

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

При реализации функций-членов класса необходимо обращаться к членам класса – данным и функциям. Такое обращение осуществляется в соответствии с правилами использования таких функций. В теле функции-члена класса имена членов этого же класса можно использовать без явного указания объекта. В данном случае имя относится к члену того объекта, для которого вызвана функция. Если возникают какие-либо неоднозначности (например, имя параметра функции совпадает с именем какого-либо члена класса), можно использовать полное квалификационное имя членов класса: имя_класса::имя_члена_класса (здесь может быть указано имя и данного – члена класса, и функции-члена класса).

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

this->имя_члена

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

          1. Пример: реализация класса Rational

Рассмотрим реализацию класса Rational, определенного выше.

class Rational{

private:

int num, den; // состояние класса – числитель и знаменатель дроби

int gcd() const; // метод класса – нахождение наибольшего общего делителя

void reduce(); // метод класса – сокращение дроби

void correct(); // метод класса – коррекция дроби

protected:

public:

/* Конструкторы класса: пустой; инициализирует дробь значением 0 */

Rational(){num = 0; den = 1; }

/* Инициализирующий с 1 аргументом; инициализирует дробь целым значением */

Rational(int num){Rational::num = num; den = 1; }

/* Инициализирующий с 2 аргументами; инициализирует дробь заданным значением */

Rational(int num, int den) {num = n; den = d; correct(); }

/* Деструктор класса */

~Rational(){}

/* Методы класса: селекторы */

void print() const;

Rational add(const Rational &opd) const;

/* Модификатор */

void assign(int x, int y);

};

Инициализирующие конструкторы обычно небольшие по размерам, поэтому их определение обычно включается в определение класса. Определение методов класса также можно включить в определение класса, если оно не велико. Но лучше вынести за пределы класса, используя при необходимости указание inline.