- •Битовые операции
- •Битовые логические операции
- •Битовые операции сдвига
- •Логические операции
- •Битовые операции
- •Логические операции
- •Логический тип
- •Преобразование типов данных
- •Символьный тип
- •Целочисленный тип
- •Вещественный тип
- •Оператор цикла while
- •Оператор цикла for
- •Оператор цикла do while
- •Программирование вложенных циклов
- •Переприсваивание
- •Объединение строк
- •Escape-знаки
- •Точные строки: символ @
- •Преобразование строк в другие типы
- •Объединения
- •Основные понятия
- •7.2. Определение функции
- •Вызов функции
- •Передача данных по значению
- •Передача данных по адресу
- •Передача данных по ссылке
- •Передача одномерного массива в функцию
- •Вызовы с переменным числом аргументов
- •Определение значений по умолчанию
- •Организация работы с файлами средствами c
- •Файловый ввод-вывод с использованием потоков
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Массивы указателей
- •Предварительная инициализация параметров функции
- •Динамические массивы ограниченного размера и их объём[]
- •Макроопределение - директива #define
- •Структура библиотеки
- •Бщее описание[править | править исходный текст]
- •Неструктурная обработка исключений[
- •Структурная обработка исключений[
Динамические массивы ограниченного размера и их объём[]
Простейший динамический массив - это массив с фиксированным размером длинны, который делится на две части: в первой хранятся элементы динамического массива, а вторая часть является резервной или неиспользуемой. Вы можете добавлять или удалять элементы в конец динамического массива в определённое время используя резервное пространство массива, до тех пор, пока оно не исчерпается. Число элементов, используемых в динамических массивах это логический размер или просто размер, в то время как размер основного массива называется объёмом динамического массива или физическим размером, который является максимально возможным размером, без переопределения размера данных.
В приложениях, где логический размер ограничен, достаточна структура данных фиксированного размера. Это может привести к неприятным последствиям, поскольку больше пространства может понадобится позже. Однако многие программисты предпочитают писать код с использованием массивов способных к изменению размеров с самого начала, а затем, на этапе оптимизации, некоторые массивы заменяют на массивы с фиксированным размером. Изменение размеров базового массива является дорогой задачей, она обычно включает в себя копирование всего содержимого массива.
38Директивы препроцессора. Макроопределения.
Почти все программы на языке С++ используют специальные команды для компилятора, которые называются директивами. В общем случае директива – это указание компилятору языка С++ выполнить то или иное действие в момент компиляции программы. Существует строго определенный набор возможных директив, который включает в себя следующие определения:
#define, #elif, #else, #endif, #if, #ifdef, #ifndef, #include, #undef.
Директива #define используется для задания констант, ключевых слов, операторов и выражений, используемых в программе. Общий синтаксис данной директивы имеет следующий вид:
#define <идентификатор> <текст>
или
#define <идентификатор> (<список параметров>) <текст>
Директива #undef отменяет определение, введенное ранее директивой #define. Предположим, что на каком-либо участке программы нужно отменить определение константы FOUR. Это достигается следующей командой:
#undef FOUR
Отличие директивы #if от директив #ifdef и #ifndef заключается в возможности проверки более разнообразных условий, а не только существует или нет какие-либо константы. Например, с помощью директивы #if можно проводить такую проверку:
Используемая в приведенных примерах директива #include позволяет добавлять в программу ранее написанные программы и сохраненные в виде файлов. Например, строка
#include < stdio.h >
Макроопределение - директива #define
Макроопределение, или макроподстановка - пожалуй, самая мощная директива препроцессора. И вместе с тем самая коварная. Давайте посмотрим, как ей пользоваться. Взгляните на такой кусочек программы:
int x[100]; int y[100]; int i; for (i=0; i<100; i++) { x[i]=fx(i); y[i]=fy(i); }
Этот код считает значения функций fx и fy в 100 точках - например, для того, чтобы потом построить их графики. Если нам понадобится увеличить количество точек, придется в трех местах заменять 100 на другое число - и писанины много, и ошибиться легко.
45Шаблоны функций.
Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
В C++ возможно создание шаблонов функций и классов.
Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип или значение одного из допустимых типов (целое число, enum, указатель на любой объект с глобально доступным именем, ссылка). Например, нам нужен какой-то класс:
class SomeClass{
int SomeValue;
int SomeArray[20];
...
};
Для одной конкретной цели мы можем использовать этот класс. Но, вдруг, цель немного изменилась, и нужен еще один класс. Теперь нужно 30 элементов массива SomeArray и вещественный тип SomeValue элементов SomeArray. Тогда мы можем абстрагироваться от конкретных типов и использовать шаблоны с параметрами. Синтаксис: в начале перед объявлением класса напишем слово template и укажем параметры в угловых скобках. В нашем примере:
template < int ArrayLength, typename SomeValueType > class SomeClass{
SomeValueType SomeValue;
SomeValueType SomeArray[ ArrayLength ];
...
};
Тогда для первой модели пишем:
SomeClass < 20, int > SomeVariable;
для второй:
SomeClass < 30, double > SomeVariable2;
Хотя шаблоны предоставляют краткую форму записи участка кода, на самом деле их использование не сокращает исполнимый код, так как для каждого набора параметров компиляторсоздаёт отдельный экземпляр функции или класса.
46 Шаблоны классов.
Любой шаблон начинается со слова template, будь то шаблон функции или шаблон класса. После ключевого словаtemplate идут угловые скобки - < >, в которых перечисляется список параметров шаблона. Каждому параметру должно предшествовать зарезервированное слово class или typename. Отсутствие этих ключевых слов будет расцениваться компилятором как синтаксическая ошибка. Некоторые примеры объявления шаблонов.
Ключевое слово typename говорит о том, что в шаблоне будет использоваться встроенный тип данных, такой как: int, double,float, char и т. д. А ключевое слово class сообщает компилятору, что в шаблоне функции в качестве параметра будут использоваться пользовательские типы данных, то есть классы. Но не в коем случае не путайте параметр шаблона и шаблон класса. Если нам надо создать шаблон класса, с одним параметром типа int и char, шаблон класса будет выглядеть так.
Как видите шаблон класса Stack объявлен и определен в файле с main-функцией. Конечно же такой способ утилизации шаблонов никуда не годится, но для примера сойдет. В строках 7 — 20 объявлен интерфейс шаблона класса. Объявление класса выполняется привычным для нас образом, а перед классом находится объявление шаблона, в строке 7. При объявлении шаблона класса, всегда используйте такой синтаксис.
Строки 47 — 100 содержат элемент-функции шаблона класса Stack, причем перед каждой функцией необходимо объявлять шаблон, точно такой же, как и перед классом - template <typename T>. То есть получается, элемент-функции шаблона класса, объявляются точно также, как и обычные шаблоны функций. Если бы мы описали реализацию методов внутри класса, то заголовок шаблона - template <typename T> для каждой функции прописывать не надо.
Чтобы привязать каждую элемент-функцию к шаблону класса, как обычно используем бинарную операцию разрешения области действия — :: с именем шаблона класса - Stack<T>. Что мы и сделали в строках 49, 58, 68, 83, 96.
Обратите внимание на объявление объекта myStack шаблона класса Stack в функции main, строка 24. В угловых скобочка необходимо явно указывать используемый тип данных, в шаблонах функций этого делать не нужно было. Далее в mainзапускаются некоторые функции, которые демонстрируют работу шаблона класса Stack. Результат работы программы смотрим ниже.
47Библиотека STL. Другие библиотеки контейнерных классов.
