- •Министерство образования российской федерации Воронежский государственный технический университет а.Г. Остапенко г.А. Кащенко и.В.Давыдов Морев д.Е.
- •Воронеж 2001
- •Рецензенты: Остапенко г.А.
- •Введение
- •Методы разработки программного обеспечения
- •Подходы к разработке программного обеспечения
- •Планирование разработки программного обеспечения
- •Основные типы языков программирования.
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентрованное программирование
- •Процедуры.
- •Модули.
- •Абстрактные типы данных.
- •Построение программного обеспечения по объектно-ориентированной методике
- •2.1. Функционирование объектно-ориентированного программного обеспечения
- •2.2. Классы. Отношения между классами
- •Этапы построения программного обеспечения
- •2.4. Объектно-ориентированный анализ
- •Информационные модели
- •Жизненные циклы
- •Модели процессов
- •2.5. Нотация для объектно-ориентированного проектирования
- •2.6. Объектно-ориентированное проектирование – ood
- •2.7. Заключительное замечание
- •Основные недостатки:
- •3. Средства объектно-ориентированного программирования
- •Средства объектно-ориентированного рограммирования Turbo-Pascal
- •Понятие “объект”
- •Статические и виртуальные методы. Полиморфизм Статические методы
- •Виртуальные методы. Полиморфизм
- •Конструкторы и деструкторы
- •3.1.5. Сравнимость данных типа объект
- •3.1.6. Динамический вызов объектов
- •3.2. Средства объектно-ориентированного
- •Понятие “класс”
- •Компоненты классов. Доступ к ним.
- •Дружественные функции
- •Конструкторы и деструкторы
- •Статические члены классов
- •3.2.6. Перегрузка операций
- •3.2.7. Виртуальные функции
- •3.2.8. Динамическое создание объектов
- •3.2.9. Проверьте свои знания!
- •Литература:
- •Оглавление
- •Воронежский государственный технический университет,
- •394026 Воронеж, Московский просп. 14
Статические члены классов
Спецификацию класса памяти static можно применять в классе к данным и функциям. Для нестатических переменных их копии существуют для каждого объекта класса (пременные всех объектов одного класса полностью независимы друг от друга). Для статических переменных эта копия только одна (для класса в целом), и доступ к ней осуществляется без ссылки на конкретный объект класса. Если х статический член класса Х, то доступ к нему выполняется по ссылке Х::x (даже если ни один объект класса х ещё не создан). Основное назначение статических членов класса – сохранение общих для всех объектов данных. Статические функции не могут получить доступ к нестатическим членам класса без указания конкретного объекта.
Пример:
class X
{
int k;
public:
static void func (int i, X *ptr);
};
main ()
{
X obj, *obj1=&obj; ……..
X::func(1, &obj); //только для статических функций
obj.func(2, &obj); //для любых функций
obj->func(3,obj1); //для любых функций
3.2.6. Перегрузка операций
Цель перегрузки: определение операций, учитывающих специфику введённых пользователем классов. Если переопределённая операция применяется для данных стандартныхтипов языка С++, то она выполняется по обычным правилам. Если же эта операция применяется для объектов, введённых пользователем классов, то она выполняется по особым правилам. Перегрузить можно только (и не все) операции, которые уже существуют в С++. Перезагрузка определяется следующим образом:
operator@(a1[,a2]),
где: operator ключевое слово;
@ знак переопределяемой операции;
a1,a2 аргументы операции, их количество должно
соответствовать количеству операндов
переопределяемой операции
Пример. Введем опреации + и * для комплексных чисел.
class complex
{
double real_part, imag_part;
public:
Complex (double r, double i)
{ real_part=r;
imag_part=i; }
friend complex operator+ (complex, complex);
friend complex operator* (complex, complex);
…….. };
Операции + (двуместная) и * получат новый смысл для данных типа complex, сохраняя обычный смысл для других типов данных. Тексты функций перегрузки:
complex operator+(complex a1, complex a2)
{
return complex (a1.real_part + a2.real_part,
a1.imag_part + a2.imag_part); }
complex operator*(complex a1, complex a2) {return ((a1.real_part * a2.real_part) –
(a1.imag_part * a2.imag_part), (a1.rael_part * a2imag_part) + (a1.imag_part *
a2.real_part));
}
После такой перегрузки допустимо определение функции:
void evalute ()
{
complex a=complex (1,3.1);
complex b (1.2,2); //допустимы обе записи
complex c=b; //конструктор не запускается
c=a+b; b=b+c*a; c=a*b+complex(1,2);
}
Следующая запись ошибочна!
complex a (1,3.1); //правильно
complex b=a+2; //ошибка, автоматическое преобразование типа не выполняется
Нетрудно ввести собственные правила преобразования типов с помощью нескольких конструкторов:
class complex
{
double real_part, imag_part;
public:
complex (double r, double i)
{real_part=r; imag_part=i;}
complex (double r)
{real_part=r; imag_part=0;}
complex()
{real_part=0; imag_part=0;}
};
После такого объявления класса допустимо:
complex a=complex (1.0,3.1);
complex b=a+complex(2);
Приведем в конце параграфа сводку правил перегрузки операций:
нельзя менять приоритет операций;
нельзя переопределять операции . :: .* ?: ;
переопределяемая операция должна существовать в языке С.