
- •Учебное пособие
- •Введение
- •Объектно-ориентированный подход
- •Объектно-ориентированное программирование Абстрактные типы данных
- •Базовые принципы объектно-ориентированного программирования
- •Простейший ввод и вывод
- •Объект cout
- •Манипуляторы hex и oct
- •Другие манипуляторы
- •Объект cin
- •Операторы для динамического выделения и освобождения памяти (new и delete)
- •Базовые конструкции объектно-ориентированных программ Объекты
- •Понятие класса
- •Конструктор копирования
- •Конструктор explicit
- •Указатели на компоненты класса
- •Встроенные функции (спецификатор inline)
- •Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •Вложенные классы
- •Static-члены (данные) класса
- •Указатель this
- •Компоненты-функции static и const
- •Proxi-классы
- •Параметры ссылки
- •Независимые ссылки
- •Практические приемы ограничения числа объектов класса
- •Наследование (производные классы)
- •Конструкторы и деструкторы при наследовании
- •Виртуальные функции
- •Абстрактные классы
- •Виртуальные деструкторы
- •Множественное наследование
- •Виртуальное наследование
- •Перегрузка функций
- •Перегрузка операторов
- •Перегрузка бинарного оператора
- •Перегрузка унарного оператора
- •Дружественная функция operator
- •Перегрузка оператора []
- •Перегрузка оператора ()
- •Перегрузка операторов new и delete
- •Преобразование типа
- •Явные преобразования типов
- •Преобразования типов, определенных в программе
- •Шаблоны Параметризированные классы
- •Передача в шаблон класса дополнительных параметров
- •Шаблоны функций
- •Совместное использование шаблонов и наследования
- •Шаблоны класса и friend
- •Некоторые примеры использования шаблона класса Реализация smart-указателя
- •Классы поддерживающие транзакции
- •Задание значений параметров класса по умолчанию
- •Пространства имен
- •Ключевое слово using как директива
- •Ключевое слово using как объявление
- •Псевдоним пространства имен
- •Организация ввода-вывода
- •Состояние потока
- •Строковые потоки
- •Организация работы с файлами
- •Организация файла последовательного доступа
- •Создание файла произвольного доступа
- •Основные функции классов ios, istream, ostream
- •Основы обработки исключительных ситуаций
- •Перенаправление исключительных ситуаций
- •Исключительная ситуация, генерируемая оператором new
- •Генерация исключений в конструкторах
- •Задание собственной функции завершения
- •Спецификации исключительных ситуаций
- •Задание собственного неожиданного обработчика
- •Иерархия исключений стандартной библиотеки
- •Стандартная библиотека шаблонов (stl) Общее понятие о контейнере
- •Общее понятие об итераторе
- •Категории итераторов
- •Основные итераторы
- •Вспомогательные итераторы
- •Операции с итераторами
- •Контейнерные классы Контейнеры последовательностей
- •Контейнер последовательностей vector
- •Контейнер последовательностей list
- •Контейнер последовательностей deque
- •Ассоциативные контейнеры
- •Ассоциативный контейнер multiset
- •Ассоциативный контейнер set
- •Ассоциативный контейнер multimap
- •Ассоциативный контейнер map
- •Адаптеры контейнеров
- •Адаптеры stack
- •Адаптеры queue
- •Адаптеры priority_queue
- •Пассивные и активные итераторы
- •Алгоритмы
- •Алгоритмы сортировки sort, partial_sort, sort_heap
- •Алгоритмы поиска find, find_if, find_end, binary_search
- •Алгоритмы fill, fill_n, generate и generate_n
- •Алгоритмы equal, mismatch и lexicographical_compare
- •Математические алгоритмы
- •Алгоритмы работы с множествами
- •Алгоритмы swap, iter_swap и swap_ranges
- •Алгоритмы copy, copy_backward, merge, unique и reverse
- •Примеры реализации контейнерных классов Связанные списки
- •Реализация односвязного списка
- •Реализация двусвязного списка
- •Реализация двоичного дерева
- •Литература
- •Вопросы по курсу ооп
- •220013, Минск, п.Бровки, 6.
Компоненты-функции static и const
В С++ компоненты-функции могут использоваться с модификатором static и const. Обычная компонента-функция, вызываемая
object . function(a,b);
имеет явный список параметров a и b и неявный список параметров, состоящий из компонент данных переменной object. Неявные параметры можно представить как список параметров, доступных через указатель this. Статическая (static) компонента-функция не может обращаться к любой из компонент посредством указателя this. Компонента-функция const не может изменять неявные параметры.
#include "iostream.h"
class cls
{ int kl; // количество изделий
double zp; // зарплата на производство 1 изделия
double nl1,nl2; // два налога на з/пл
double sr; // кол-во сырья на изделие
static double cs; // цена сырья на 1 изделие
public:
cls(){} // конструктор по умолчанию
~cls(){} // деструктор
void inpt(int);
static void vvod_cn(double);
double seb() const;
};
double cls::cs; // явное определение static-члена в контексте файла
void cls::inpt(int k)
{ kl=k;
cout << "Введите з/пл и 2 налога";
cin >> nl1 >> nl2 >> zp;
}
void cls::vvod_cn(double c)
{ cs=c; // можно обращаться в функции только к static-компонентам;
}
double cls::seb() const
{return kl*(zp+zp*nl1+zp*nl2+sr*cs);//в функции нельзя изменить ни один
} // неявный параметр (kl zp nl1 nl2 sr)
void main()
{ cls c1,c2;
c1.inpt(100); // инициализация первого объекта
c2.inpt(200); // инициализация второго объекта
cls::vvod_cn(500.); //
cout << "\nc1" << c1.seb() << "\nc2" << c2.seb() << endl;
}
Ключевое слово static не должно быть включено в описание объекта статической компоненты класса. Так, в описании функции vvod_cn отсутствует ключевое слово static. В противном случае возможно противоречие между static- компонентами класса и внешними static-функциями и переменными.
Следующий далее пример демонстрирует доступ к static данным класса из различных функций.
#include "iostream.h"
class cls
{ static int i;
int j;
public:
static int k; // объявление static-члена в объявлении класса
void f1();
static void f2();
};
int cls::k=0; // явное определение static-члена в контексте файла
int cls::i=0;
void cls::f1() // из функции класса возможен доступ
{ cout << ++k<<' '<<++i<< endl;}// к private и public static данным
void cls::f2() // из static функции класса возможен
{ cout <<++k<<' '<<++i<<endl;} // доступ к private и public static данным
void f3() // из внешней функции возможен
{cout<<++cls::k<<endl;} // доступ только к public static данным
void main()
{ cls obj;
cout << cls::k<<endl; // возможен доступ только к public static данным
obj.f1();
cls::f2();
f3();
}
Результат работы программы:
0
1 1
2 2
3
Функции класса, объявленные со спецификатором const, могут быть вызваны для объекта со спецификатором const, а функции без спецификатора const - не могут.
const cls c1;
cls c2;
c1.inpt(100); // неверный вызов
c2.inpt(100); // правильный вызов функции
c1.seb(); // правильный вызов функции
Для функций со спецификатором const указатель this имеет следующий тип:
const имя_класса * const this;
Следовательно, нельзя изменить значение компоненты объекта через указатель this без явной записи. Рассмотрим это на примере функции seb.
double cls::seb() const
{ ((cls *)this)->zp--; // возможная модификация неявного параметра
// zp посредством явной записи this-указателя
return kl*(zp+zp*nl1+zp*nl2+sr*cs);
}
Если функция, объявленная в классе, описывается отдельно (вне класса), то спецификатор const должен присутствовать как в объявлении, так и в описании этой функции.
Основные свойства и правила использования static- и const- функций:
- статические компоненты-функции не имеют указателя this, поэтому обращаться к нестатическим компонентам класса можно только с использованием . или ->;
- не могут быть объявлены две одинаковые функции с одинаковыми именами и типами аргументов, при этом одна статическая, а другая нет;
статические компоненты-функции не могут быть виртуальными.