Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Статические компонентные данные и компонентные функции static и const




 

Статические элементы данных хранятся в одном месте, являются общими для всех объектов класса и существуют независимо от них.

При вызове компонентная функция – объектная функция (а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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...