Статические компонентные данные и компонентные функции static и const
⇐ ПредыдущаяСтр 5 из 5
Статические элементы данных хранятся в одном месте, являются общими для всех объектов класса и существуют независимо от них. При вызове компонентная функция – объектная функция (а1, а2, а3); получает явный (а1, а2, а3) и неявный список аргументов (компонентные данные объекта). Неявные аргументы доступны посредством this. Статическая компонентная функция доступа к компонентным данным не имеет, за исключением статических. Обращение через оператор разрешения области видимости к статическим компонентным данным и функциям является предпочтительным:
class_type:: статический_элемент class_type:: статическая_функция ()
Именно так отражается тот факт, что элемент и функция являются статическими. Компонентная функция, объявленная как const, не может изменять свои неявные аргументы, она получает неявный указатель: const class_type * const this.
Изменчивость
Объекты класса могут быть объявлены как константы, и это гарантирует постоянство компонентных данных. Отказаться можно с помощью const_cast или индивидуально для отдельных компонентных данных с использованием ключевого слова mutable.
Вложенные классы
Классы могут быть созданы внутри блоков, в том числе внутри других классов, как часть реализации более сложной конструкции. Использование таких классов невозможно за пределами соответствующих блоков. Вложение классов позволяет вкладывать определения функций - компонентная функция должна быть определена внутри своего локального класса, и на данную функцию нельзя ссылаться вне области видимости ее локального класса.
Пример:
class type { public: void f1 (int b) {x = b; y = 0;} // компонентная функция для доступа к x и y
void f2 (double k) {y = k*x;} static void f3 (int c) {z = c;} //статическая компонентная функция для доступа только к z int f4 () const {return x+y+z;} // f4 не может изменять x, y, z friend int f5 (const type & t); // дружественная классу type функция, аналог f4 private: int x; //элемент данных индивидуальный для int y; // каждого объекта static int z; //статический элемент данных, общий для всех объектов }; int type:: z = 10; // должен быть определен и инициализирован вне класса main() { type w1,w2; //объявление объектов w1.f1(100); // инициализация w1: x = 100, y = 0, z = 10 w2.f1(200); // инициализация w2: x = 200, y = 0, z = 10 w1.f2(0.5); // вычисление y в w1 w2.f2(0.8); // вычисление y в w2 type:: f3(300); // вызов f3 для изменения z в w1 и w2 cout <<”w1 = ”<<w1.f4() // сумма x, y, z в w1 <<”w2 = ”<<f5(w2)<<endl; // сумма x, y, z в w2 }
Задания
Разработайте алгоритм и программу, реализующую абстрактный тип данных (АТД) – класс, согласно варианту задания (см. раздел III). Предусмотрите закрытую реализацию и открытый интерфейс. Интерфейс должен содержать псевдоконструкторы и псевдодеструктор, функции присваивания, вывода содержимого и обработки (сортировка, поиск, сравнение, арифметические действия и т.д.). Проверьте работоспособность АТД на тестовом наборе данных. Контрольные вопросы
1. Дайте определение понятия «класс». Сформулируйте правила доступа к его элементам. 2. С какой целью в классе объединены компонентные данные и компонентные функции? 3. Каким образом осуществляется доступ к открытым и закрытым элементам? 4. Опишите назначение дружественных функций, назовите их разновидности. 5. Что понимается под указателем this? 6. Каковы особенности использования статических компонентных данных? 7. В чем заключается синтаксис и семантика компонентных функций static и const? 8. Каким образом могут изменяться компонентные данные объектов, объявленных константами? 9. Каковы особенности создания вложенных классов?
Раздел V СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ КЛАССА
Цель работы: изучить синтаксис и семантику определения и вызова конструкторов и деструкторов; приобрести практические навыки создания и уничтожения объектов; изучить особенности применения различных видов конструкторов.
Основные теоретические положения
Определение конструктора и деструктора Конструктор (constructor) – это компонентная функция, предназначенная для создания объектов типа своего класса. Под созданием понимается инициализация компонентных данных и при необходимости распределения под них свободной памяти с помощью new. Имя конструктора совпадает с именем класса. Деструктор (destructor) – это компонентная функция, предназначенная для уничтожения объектов типа своего класса. Под уничтожением понимается освобождение свободной памяти с помощью delete. Имя деструктора – это предваряемое символом «~» Имя класса.
Конструктор по умолчанию
Классы с конструктором по умолчанию могут использоваться для объявления массивов.
Н а п р и м е р: type m[10];
является объявлением массива из десяти объектов типа type, при этом используется конструктор по умолчанию:
type:: type() {…..} // список аргументов пустой или type:: type(int i = 0) {……} // все аргументы имеют значения по умолчанию
Копирующий конструктор
Копирующий конструктор предназначен для копирования одного значения типа класса в другое и имеет вид type:: type (const type & x) Копирующий конструктор вызывается в следующих случаях: - если объект типа type инициализируется значением типа type; - когда параметр типа type передается функции по значению; - когда функция возвращает значение типа type. При отсутствии копирующего конструктора эти действия по умолчанию выполняются поэлементно.
Конструктор – функция преобразования типа
Конструктор с одним параметром автоматически является функцией преобразования типа параметра к типу класса.
Н а п р и м е р:
type:: type (int); // преобразует int к type.
Использование explicit в начале объявления запрещает такое преобразование.
Инициализаторы конструктора
Класс, содержащий элементы, тип которых требует конструктор, использует инициализаторы – разделенный запятыми список вызовов конструкторов, стоящий после двоеточия. Конструктор вызывается с помощью имени элемента, за которым в круглых скобках следует список аргументов. Элементы инициализируются в порядке объявления их в классе.
Н а п р и м е р:
type:: type (int t): i(7), j(t) //инициализаторы {// остальное тело конструктора}
Инициализаторы необходимы всегда для нестатических элементов констант или ссылок. Конструкторы и деструкторы не наследуются. В отличие от деструкторов конструкторы не могут быть виртуальными. П р и м е р:
class vector{ public: explicit vector (int n = 10); // константа по умолчанию vector (const vector & v); // копирующая константа vector (const int a[ ], int n); // конструктор с параметрами ~vector () {delete [ ] p;} // деструктор -- -- -- -- -- -- -- -- private: int *p; // базовый адрес массива int size; // число элементов массива };
Задания
Модифицируйте абстрактный тип данных, реализованный по заданию раздела IV, согласно варианту задания (см. раздел III), заменив соответствующие компонентные функции на систему конструкторов и деструктор. Проверьте работоспособность АТД на тестовом наборе данных.
Контрольные вопросы
1. Каковы особенности синтаксиса и семантики конструкторов и деструкторов? 2. В чем заключаются особенности применения конструкторов по умолчанию? 3. В каких случаях вызывается копирующий конструктор? 4. При каких условиях конструктор может использоваться для преобразования типа? 5. В каких ситуациях необходимы инициализаторы конструктора, синтаксис и семантика их использования?
Рекомендуемая литература
1. Бадд Т. Объектно-ориентированное программирование в действии: Пер. с англ. – СПб.: Питер, 1997. – 464 с. 2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++: Пер. с англ. – 2-е изд. – М.: Изд-во "БИНОМ"; СПб.: Невский диалект, 1999. – 560 с. 3. Подбельский В.В. Язык С++: Учеб. пособие для вузов. – 5-е изд. – М.: Финансы и статистика, 2001. 4. Пол А. Объектно-ориентированное программирование на С++: Пер. с англ. – 2-е изд. – СПб.: Невский диалект; М.: Изд-во "БИНОМ", 1999. – 462 с.
5. Страуструп Б. Язык программирования С++: Пер. с англ. - 3-е изд. – СПб.: Невский диалект: М.: Изд-во "БИНОМ", 1999. - 991 с. 6. Фридман А.Л. Основы объектно-ориентированного программирования на языке С++. – М.: Горячая линия –Телеком, Радио и связь, 1999. – 208 с.
Содержание Введение...................................................................................................... 3 Раздел I. Программирование функций........................................... 4 Раздел II. Обработка массивов......................................................... 9 Раздел III. Обработка структурированных типов данных............... 14 Раздел IV. Разработка абстрактных типов данных.......................... 18 Раздел V. Создание и уничтожение объектов класса..................... 22 Рекомендуемая литература................................................................... 25
Редактор Н.А. Бачурина Компьютерная верстка: М.Н. Авдюхова ЛР № 021316 от 25 декабря 1998 г. Сдано в набор 25.12.02 г. Подписано к печати 27.02.03 г. Тир. 25 экз. Уч.-изд. л. 0,8. Формат 60´84 1/16. Усл. печ. л. 1,63. Гарнитура Таймс. Зак.
Череповецкий государственный университет 162600, г. Череповец, пр. Луначарского, 5
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|