- •Концепция класса
- •Переменные класса
- •Методы класса
- •Наследование
- •Конструктор и деструктор
- •Виды памяти и создание объектов
- •Управление доступом к переменным и методам класса
- •Интерфейс
- •Исключения
- •Шаблоны
- •Введение в наследование
- •Множественное наследование классов
- •Преобразование типов
- •Виртуальные функции
Методы класса
Второй аспект, описание которого содержит класс – это аспект поведения. Поведение класса (точнее всех объектов, принадлежащих классу) описывается совокупностью методов. Каждый метод представляет собой функцию, действующую в контексте класса. Этот контекст используется компилятором в ходе поиска переменной по ее имени. Когда компилятор встречает имя некоторой переменной в методе,
-
сначала он ищет ей соответствие среди переменных, объявленных в рамках метода,
-
затем среди переменных, объявленных в рамках того класса, к которому относится данный метод,
-
и только затем среди глобальных переменных:
Рисунок 1 Последовательность поиска переменных в рамках метода по их имени
Как и функция структурного языка, метод объектно-ориентированного языка может принимать ряд переменных (являющихся параметрами), и может возвращать одну переменную (являющуюся результатом). Совокупность всех этих переменных представляет собой сигнатуру метода.
В объектно-ориентированном программировании методы классифицируются по различным критериям. Начнем рассмотрение с классификации по принципу статичности. Так, все нестатические методы принимают в качестве неявного параметра тот объект, в контексте которого они работают. Для таких методов использование переменной класса подразумевает обращение к переменной именно того объекта, который передан в качестве неявного параметра. Эти методы могут быть вызваны только в контексте некоторого объекта. Невозможно вызвать нестатический метод «вообще», не указав конкретный объект. Статические методы, наоборот, вызываются только вне контекста какого-либо объекта. Они не имеют неявных параметров.
Приведем пример объявления нестатического метода в C++:
class Person { float aMethod (int param1, float param2, char * param 3); }; |
Такой метод будет обязательно иметь неявный аргумент – указатель на тот объект, для которого он вызывается:
В случае, если метод является статическим, к его объявлению добавляется специальное ключевое слово static:
class Person { static float aMethod (int param1, float param2, char * param 3); }; |
Такой метод не будет иметь неявного аргумента:
Переменные класса также классифицируются по критерию статичности. Статической переменной считается переменная, объявленная в рамках класса, но не включаемая в каждый объект этого класса. Статические переменные существуют в единственном экземпляре для всех объектов класса. Даже если в памяти нет ни одного экземпляра класса, статическая переменная все равно уже существует. Статические переменные создаются в начале работы всей программы в целом и удаляются в конце ее работы. Так как статические методы работают вне контекста конкретного объекта, то они могут обращаться только к статическим переменным класса.
Так, если мы в любое место класса «персона» добавим статическую переменную «количество персон»:
class Person { int number; -- Индивидуальный номер человека static int personCnt; -- Количество персон char name[10]; -- Имя int age; -- Возраст float height; -- Рост }; |
то представление каждого объекта в памяти не изменится и останется тем же, что и без статических переменных:
Добавленная статическая переменная будет создана в единственном экземпляре для всех объектов в сегменте данных программы во время ее загрузки.
Следующим критерием классификации методов является их постоянство. Метод считается постоянным, если в нем не происходит изменения значений переменных того объекта, для которого он вызван. Приведем пример объявления постоянного метода в C++:
class Person { float aMethod (int param1, float param2, char * param 3) const; }; |
Другие виды методов мы опишем после изложения принципа наследования классов в объектно-ориентированном программировании.