Передача структур функциям
Структурные переменные могут передаваться функциям как по значению, так и по ссылке. Например, при печати содержимое переменных a и *p может иметь следующие определение и вызов:
void print (type d) // print (a); {cout<<d.name<<endl; // print (*p); cout<<d.id_n<<endl; }
Однако передача структур по значению требует создания локальной копии структурной переменной при вызове функции и может быть проблематичной, в случае если элементы структуры являются указателями:
struct type {char *name; int id_n;} b;
Так, при передаче переменной b компилятор выделит память только под указатель name, для информации, адресуемой через name, память не выделяется. Более предпочтительной для структур является передача параметров по ссылке:
void print (const type& d) // print(a); { ----------------------------------}
В этом случае, чтобы функция не могла изменить содержимое по адресу передаваемой переменной, используется const.
Объединения
Объединение (union) – это производный от структур тип, элементы которого совместно используют память так, что их значения перекрываются.
Н а п р и м е р: union type {int n; double y;} x = {10};
Здесь x - переменная типа union type, инициализируемая значением 10, которое присваивается первому элементу n. Память, выделяемая для переменной x, будет общая как для элемента n, так и для элемента y. Поэтому x может использоваться или как целая переменная, или как переменная с двойной точностью.
Динамические структуры данных
Синтаксис языка С++ допускает определение структуры с элементами, которые являются указателями на тип самой структуры. Это позволяет создавать динамические типы с произвольным числом таких структур, связанных вместе.
Н а п р и м е р: struct type_list { type data; type_list * next;} *list_1; list_1= new type_list; 1 2 3 list_→ datа data data next next next = 0
Здесь list_1 – указатель на начало списка; data – данные типа type; next – адрес следующего элемента типа type_list или 0. Через указатель на начало списков осуществляется доступ к данным, хранящимся в элементах.
Задания Разработайте алгоритм и программу, реализующую структурированный тип данных (СТД), согласно варианту. Определите функции инициализации, присваивания, вывода содержимого и обработки (сортировка, поиск, сравнение, арифметические действия и т.д.). Варианты СТД: 1. Динамический вектор; 2. Динамическая матрица; 3. Динамический куб; 4. Динамический стек; 5. Динамическая очередь; 6. Линейный связанный список; 7. Динамический массив комплексных чисел; 8. Мультивектор, содержащий три вектора; 9. Персонал; 10. Библиотека. Проверьте работоспособность СТД на тестовом наборе данных. Контрольные вопросы
1. Что такое структуры и объединения? Сформулируйте правила инициализации. 2. Опишите механизм передачи структур функциям. 3. По какому принципу создаются динамические структуры данных? 4. Объясните, что представляет собой массив структур? 5. В каких случаях возникает необходимость использовать вложенные структуры и объединения? Р а з д е л IV РАЗРАБОТКА АБСТРАКТНЫХ ТИПОВ ДАННЫХ Цель работы: изучить способы определения классов, правила доступа к элементам; приобрести практические навыки работы с объектами класса; изучить принципы и механизмы создания абстрактных типов данных. Основные теоретические положения
Определение классов Класс – это гетерогенный агрегатный тип, имеющий элементы, данные и элементы функций, обеспечивающий сокрытие данных и наследование. Структура класса имеет вид:
class имя_типа {public: // элементы доступны и наследуются ----- ------ -------
----- ------ ------- protected: //элементы защищены и наследуются ----- ------ ------- ----- ------ ------- private: //элементы закрыты, не наследуются ----- ------ ------- ----- ------ ------- };
Спецификаторы доступа public, protected и private определяют степень открытости элементов, которые следуют за ними. По умолчанию элементы структуры являются открытыми, элементы класса – закрытыми. Компонентные функции
Функции, объявленные или определенные внутри класса, являются компонентными. Они имеют доступ к закрытым, защищенным и открытым элементам своего класса, могут быть перегруженными. Компонентные функции вызываются с помощью оператора. или →, а также при объявлении объектов класса (конструкторы), при уничтожении объектов (деструкторы), при перегрузке операторов.
Дружественные функции
Дружественная функция должна быть объявлена внутри объявления класса, по отношению к которому она является дружественной, с использованием спецификатора friend. Такая функция имеет доступ к закрытым элементам класса наряду с компонентными функциями. Дружественными могут быть как внешние, так и компонентные функции, в этом случае для указания имени функции в дружественном классе используется оператор разрешения области видимости ::.
Н а п р и м е р:
class A {----- friend int B:: f(); // f() - компонентная функция класса В, дружественная классу А }; class C {---- friend class B; // все компонентные функции класса В являются дружественными классу С }; class D {---- friend D f(D); // f() - внешняя функция, дружественная классу D };
Указатель this
Ключевое слово this неявно объявляет указатель на себя. Может иметь место только в нестатических компонентных функциях. Заменяет объявление закрытого элемента:
class_type * const this.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|