Содержание:
1. Статические элементы класса
2. Виртуальные функции
3. Абстрактные классы
4. Виртуальные классы
5. Шаблоны
6. Обработка исключительных ситуаций в C++
1. Статические элементы класса
В классе можно определять элементы данных и функции со спецификатором static. В этом случае их можно рассматривать как глобальные переменные или функции в пределах класса, и доступны они не одному объекту, а разделяются между всем классом, не ассоциируются с отдельными представителями класса.
class Name
{ …
public:
…
static int count; }
Для элементов, которые объявлены в открытой секции класса, вызов, например, будет выглядеть следующим образом:
Name::count+=2;
Если элементы определены в закрытой секции, то такое обращение некорректно.
Если мы объявили такой элемент в закрытой секции класса, то мы должны определить функции для работы с этими элементами. Обращение к таким функциям выглядит так: Name::Add1();
ПРАВИЛО:
1) Статические функции и элементы класса не ассоциируются с отдельными представителями класса. Обращение к ним производится выражением вида:
имя класса:: имя элемента
2) Им не передается указатель this, т.к. он ассоциируется с отдельным представителем класса.
3) Статические функции могут вызываться независимо от того, существует ли хотя бы один представитель класса.
4) Статические функции не могут быть виртуальными.
2. Виртуальные функцииВиртуальные функции – это функции-члены класса, вызов которых осуществляется во время выполнения программы (то есть динамически) по типу объекта, с которым она используется.
Например, базовый класс может описывать фигуру на экране без конкретизации ее вида, а производные классы (окружность, эллипс и т.п.) однозначно определяют ее формы и размеры. Если в базовом классе ввести функцию для изображения фигуры на экране, то выполнение этой функции будет возможно только для объектов каждого из производных классов, определяющих конкретные изображения.
Объявление виртуальной функции в классе:
virtual прототип_функции;
Отметим, что классы, включающие такие функции, играют особую роль в объектно-ориентированном программировании. Именно поэтому они носят специальное название – полиморфные.
Вернемся к упомянутому выше примеру с фигурами. Рассмотрим класс Point (производный от Location).
Пусть в этом классе определена компонентная функция void Show(). Так как внешний вид фигуры, для которой будет использоваться данная функция, в базовом классе еще не определен, то в каждый из производных классов нужно включить свою функцию void Show() для формирования изображения на экране. Это не очень удобно, поэтому в таких случаях используют механизм виртуальных функций. Любая нестатическая функция базового класса может быть сделана виртуальной, если в ее объявлении использовать спецификатор virtual.
class Point: public Location{
protected:
Boolean vis;
public:
Point (int nx,int ny);
virtual void Show();
virtual void Hide();
virtual void Drag(int by);
Boolean Isvis() { return vis;}
void MoveTo (int nx ,int ny); };
Виртуальными могут быть не любые функции, а только нестатические компонентные функции какого-либо класса. После того как функция определена как виртуальная, ее повторное определение в производном классе (с тем же самым прототипом) создает в этом классе новую виртуальную функцию, причем спецификатор virtual может не использоваться.
В производном классе нельзя определять функцию с тем же именем и с той же сигнатурой параметров, но с другим типом возвращаемого значения, чем у виртуальной функции базового класса. Это приводит к ошибке на этапе компиляции.
Если в производном классе ввести функцию с тем же именем и типом возвращаемого значения, что и виртуальная функция базового класса, но с другой сигнатурой параметров, то эта функция производного класса не будет виртуальной. В этом случае с помощью указателя на базовый класс при любом значении этого указателя выполняется обращение к функции базового класса (несмотря на спецификатор virtual и присутствие в производном классе похожей функции).
Рассмотрим, как будет выглядеть вызов виртуальной функции void Show() в производном классе:
class Circle : public Point {
protected:
int R;
public:
Circle (int nx,int ny, int nr);
void Show();
void Hide();
void Expand(int by);
void Contract(int by); };
Как мы видим, спецификатор virtual можно уже не указывать.
Механизм виртуального вызова может быть подавлен с помощью явного использования полного квалифицированного имени. Таким образом, при необходимости вызова из производного класса виртуального метода (компонентной функции) базового класса употребляется полное имя.
Все выше сказанное можно объединить в ПРАВИЛА:
1) не объявлять static;
2) Объявления виртуальных функций в производных классах должны иметь ту же сигнатуру, что и в базовом. Указывать спецификатор virtual в этом случае не обязательно.
3) Виртуальная функция должна быть обязательно определена или быть чистой виртуальной функцией.
Чистой виртуальной функцией называется компонентная функция, которая имеет следующее определение:
virtual тип имя_функции (список формальных параметров)=0;
В этой записи конструкция “=0” называется “чистый спецификатор”. Пример описания чистой виртуальной функции:
virtual void F()=0;
Чистая виртуальная функция в определении класса показывает, что ее определение откладывается до производных классов. Чистая виртуальная функция “ничего не делает” и недоступна для вызовов. Ее назначение – служить основой для подменяющих ее функций в производных классах и показывать, что данный класс абстрактный.
... заимствуются из стандартной библиотеки Си. Кроме того, существует огромное количество библиотек Си++, не входящих в стандарт. В программах на Си++ можно использовать многие библиотеки Си. Стандартизация определила язык программирования Си++, однако за этим названием могут скрываться также неполные, ограниченные, достандартные варианты языка. В первое время язык развивался вне формальных рамок, ...
... на деле индивидуального подхода в обучении), что является необходимым условием активной самостоятельной деятельности ученика по усвоению учебного материала. Перечисленные четыре особенности и характеризуют программированное обучение. Программированное обучение осуществляется с помощью "обучающей программы", отличающейся от обычного учебника тем, что она определяет не только содержание, но и ...
... программирование [application programming] — разработка и отладка программ для конечных пользователей, например бухгалтерских, обработки текстов и т. п. Системное программирование [system programming] — разработка средств общего программного обеспечения, в том числе операционных систем, вспомогательных программ, пакетов программ общесистемного назначения, например: автоматизированных систем ...
... AVR Studio запомнит расположение окон и использует эти установки при следующем запуске проекта. 3.2. Анализ методики реализации разработки программного обеспечения 3.2.1. Классификация вариантов заданий Цель заданий – практическое освоение методики программирования на ассемблере микроконтроллеров ATMEL семейства AVR, отладка программы на симуляторе AVR Studio и программирование кристалла с помощью ...
0 комментариев