
- •1. Роль вычислительной техники в решении прикладных задач.
- •2. Задачи, особенности и основные инструменты прикладного программирования
- •3.Языки программирования: классификация, особенности, критерии выбора.
- •4. Архитектура прикладных информационных систем.
- •5. Процедурная и объектно-ориентированная декомпозиция.
- •6. Основные принципы объектно-ориентированного программирования: абстрагирование, инкапсуляция, наследование, полиморфизм, модульность, сохраняемость, параллелизм.
- •7. Объекты и типы объектов. Атрибуты объектов и типы атрибутов. Методы объектов.
- •9. Директивы препроцессора: #include, #define, #error, #pragma, операции # и ##
- •11. Компиляция программы и сборка исполняемого модуля.
- •12. Размещение программы и данных в памяти.
- •13. Структура исполняемого модуля.
- •14. Переменные: объявление, определение, инициализация
- •15. Переменные: значение, указатель, ссылка.
- •16.Время жизни и области видимости переменных.
- •19. Составные типы данных.
- •20. Встроенные массивы: размещение в памяти, доступ к элементам. Размещение массива в памяти
- •Элементы массива
- •22. Условные конструкции выбора if/else , select.
- •23. Конструкции циклов for, while, do/ while; операторы break и continue.
- •24. Логические операции.
- •25. Функции: объявление, определение, передача аргументов по ссылке и по значению; входные и выходные параметры, возвращаемое значение, инструкция return.
- •26. Перегрузка функций.
- •27. Библиотека стандартного потокового ввода/вывода. Форматированный ввод/вывод. Файловые потоки, потоки в памяти.
- •28. Обработка строк, класс string.
- •29. Классы. Инкапсуляция. Сокрытие данных и видимость членов класса. Идиома «pimpl».
- •30. Конструктор класса. Конструктор с параметрами и конструктор по умолчанию. Конструкторкопирования.Операторприсваивания.Деструктор.
- •31.Наследование и полиморфизм классов: виртуальные функции.
- •32.Абстрактные базовыеклассы.
- •33.Множественное наследование.
- •34.Перегрузка операторов.
- •35.Объекты-владельцы. «Интеллектуальные» указатели.
- •36. Объекты-владельцы с частной копией ресурса.
- •37. Объекты-владельцы с совместным владением ресурсом.
- •38. Приведениетипов. Операторыstatic_cast, reinterpret_cast, dynamic_cast.
- •39. Константные и не-константные переменные. Оператор const_cast.
- •40. Шаблоны функций и шаблоны классов.
- •41. КонтейнерыстандартнойбиблиотекиStl.
- •42. Итераторы контейнеров.
- •43. Динамический массив на примере контейнера vector.
- •44. Связный список на примере контейнера list.
- •45. Контейнер deque библиотеки stl.
- •46. Ассоциативные контейнеры: map, multimap, set, multiset.
- •47. Стандартные алгоритмы: алгоритм sort; объекты-функции.
- •48. Взаимодействие прикладных программ с базами данных. Протокол odbc.
- •49. Оконный интерфейс. Организация графического оконного интерфейса при помощи оконных сообщений в ос Windows.
- •50. Работа с объектами графического интерфейса gdi.Кисти и перья; контекст устройства вывода («devicecontext»)
39. Константные и не-константные переменные. Оператор const_cast.
const_cast
Назначение: Снятие/установка модификатора const или volatile.
Ограничения на expression_from: ссылка или указатель.
Ограничения на type_to: должен совпадать с типом expression_from с точностью до модификаторов const или volatile.
Производит ли код: нет.
Возможные ошибки: чревато попыткой изменить неизменный объект.
Константы как особый тип переменных, значения которых изменять не предполагается. Объявление константной переменной выполняется с помощью ключевого слова const, при этом переменная должна быть инициализирована значением сразу при ее объявлении. В дальнейшем любая попытка изменить значение константной переменной приведет к ошибке компиляции.
Константы можно объявлять на уровне полей или локальных переменных. Константы нельзя инициализировать ссылкой, значение которой вычисляется во время выполнения программы, но можно инициализировать выражением, значение которого вычисляется во время компиляции. При этом значения константных полей или переменных сразу вычисляются компилятором и подставляются вместо идентификаторов констант.
В приведенном примере тип класса содержит константные поля, которые инициализируются во время компиляции.
using System;
classMyClass
{
publicconst string MESSAGE = "Привет!";
publicconst double PI = 3.14;
publicconstbool TRUE = true;
publicconstbool FALSE = !TRUE;
publicMyClass()
{
Console.WriteLine("{0} {1} {2} {3}",
MESSAGE, PI, TRUE, FALSE);
}
}
class Start
{
static void Main()
{
MyClassmyClass = new MyClass();
Console.ReadLine();
}
}
Для отличия констант от переменных их имена принято обозначать в верхнем регистре. Поскольку во всех экземплярах класса значение константных полей класса будет одно и то же, то эти поля-константы считаются неявно статическими и в вызывающем коде к ним нужно адресоваться по имени класса, а не по имени объекта. Если константное поле или переменная определены в области видимости блока кода, то к ним можно адресоваться напрямую.
40. Шаблоны функций и шаблоны классов.
Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
В C++ возможно создание шаблонов функций и классов.
Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип или значение одного из допустимых типов (целое число, enum, указатель на любой объект с глобально доступным именем). Например, нам нужен какой-то класс:
classSomeClass{
intSomeValue;
intSomeArray[20];
...
}
Для одной конкретной цели мы можем использовать этот класс. Но, вдруг, цель немного изменилась, и нужен еще один класс. Теперь нужно 30 элементов массива SomeArray и вещественный тип SomeValue и элементов SomeArray. Тогда мы можем абстрагироваться от конкретных типов и использовать шаблоны с параметрами. Синтаксис: в начале перед объявлением класса напишем слово template и укажем параметры в угловых скобках. Внашемпримере:
template<intArrayLength, typenameSomeValueType> class SomeClass{
SomeValueTypeSomeValue;
SomeValueTypeSomeArray[ArrayLength ];
...
}
Тогда для первой модели пишем:
SomeClass< 20, int>SomeVariable;
длявторой:
SomeClass< 30, double>SomeVariable2;
Хотя шаблоны предоставляют краткую форму записи участка кода, на самом деле их использование не сокращает исполнимый код, так как для каждого набора параметров компилятор создаёт отдельный экземпляр функции или класса.
Шаблоны классов
В классе, реализующем связный список целых чисел, алгоритмы добавления нового элемента списка, поиска нужного элемента не зависят от того, что элементы списка — целые числа. Те же алгоритмы применялись бы и для списка символов, строк, дат, классов игроков, и так далее.
template< class T >
class List
{
/* ... */
public:
void Add( const T& Element );
bool Find( const T& Element );
/* ... */
};
Использование шаблонов
Для использования шаблона класса, необходимо указать его параметры:
List<int> li;
List<string>ls;
li.Add( 17 );
ls.Add( "Hello!" );
Шаблоны функций
Синтаксис описания шаблона
Шаблон функции начинается с ключевого слова template, за которым в угловых скобках следует список параметров. Затем следует объявление функции:
template<typename T >
voidsort( T array[], intsize ); // прототип: шаблон sort объявлен, но не определён
template<typename T >
void sort( T array[], int size ) // объявлениеиопределение
{
T t;
for (inti = 0; i< size - 1; i++)
for (int j = size - 1; j >i; j--)
if (array[j] < array[j-1])
{
t = array[j];
array[j] = array[j-1];
array[j-1] = t;
}
}
template<intBufferSize> // целочисленныйпараметр
char* read()
{
char *Buffer = new char[ BufferSize ];
/* считывание данных */
returnBuffer;
}
Ключевое слово typename появилось сравнительно недавно, поэтому стандарт[1] допускает использование class вместо typename:
template<class T >
Вместо T допустим любой другой идентификатор.
Пример использования
Простейшим примером служит определение минимума из двух величин. Если a меньше b то вернуть а, иначе - вернуть b. В отсутствие шаблонов программисту приходится писать отдельные функции для каждого используемого типа данных. Хотя многие языки программирования определяют встроенную функцию минимума для элементарных типов (таких как целые и вещественные числа), такая функция может понадобиться и для сложных (например «время» или «строка») и очень сложных («игрок» в онлайн-игре) объектов.
Так выглядит шаблон функции определения минимума:
template<typename T >
T min( T a, T b )
{
return a < b ? a : b;
}
Для вызова этой функции можно просто использовать её имя:
min( 1, 2 );
min( 'a', 'b' );
min( string( "abc" ), string( "cde" ) );
Вызов шаблонной функции
Вообще говоря, для вызова шаблонной функции, необходимо указать значения для всех параметров шаблона. Для этого после имени шаблона указывается список значений в угловых скобках:
inti[5] = { 5, 4, 3, 2, 1 };
sort<int>( i, 5 );
char c[] = "бвгда";
sort< char >( c, strlen( c ) );
sort<int>( c, 5 ); // ошибка: у sort<int>параметрint[] ане char[]
char *ReadString = read< 20 >();
delete [] ReadString;
ReadString = read< 30 >();
Для каждого набора параметров компилятор генерирует новый экземпляр функции. Процесс создания нового экземпляра называется инстанцированием шаблона.
В примере выше компилятор создал две специализации шаблона функции sort (для типов char и int) и две специализации шаблона read (для значений BufferSize 20 и 30). Последнее скорее всего расточительно, так как для каждого возможного значения параметра компилятор будет создавать новые и новые экземпляры функций, которые будут отличаться лишь одной константой.
Выведение значений параметров
В некоторых случаях компилятор может сам вывести (логически определить) значение параметра шаблона функции из аргумента функции. Например, при вызове вышеописанной функции sort необязательно указывать параметр шаблона (если он совпадает с типом элементов аргумента-массива):
inti[5] = { 5, 4, 3, 2, 1 };
sort(i, i + 5 ); // вызывается sort<int>
char c[] = "бвгда";
sort( c, c + strlen( c ) ); // вызывается sort< char >
Возможно выведение и в более сложных случаях.
В случае использования шаблонов классов с целыми параметрами также возможно выведение этих параметров. Например:
template<int size >
classIntegerArray
{
int Array[ size ];
/* ... */
};
template<int size > // Прототипшаблона
voidPrintArray( IntegerArray< size > array ) { /* ... */ } // Вызов шаблона
// Использование объекта шаблона
IntegerArray<20>ia;
PrintArray( ia );
Правила выведения введены в язык для облегчения использования шаблона и для избежания возможных ошибок, например попытка использования sort<int> для сортировки массива символов.Если параметр шаблона можно вывести по нескольким аргументам, то результат выведения должен быть в точности одинаков для всех этих аргументов. Например, следующие вызовы ошибочны:
min (0, 'a');
min (7, 7.0);
Ошибки в шаблонах
Некоторые ошибки в описании шаблона могут быть выявлены уже в месте описания. Эти ошибки не зависят от конкретных параметров. Например:
template<class T >
void f( T data )
{
T *pt = 7; // ошибка: инициализация указателя целым числом
datA = 0; // ошибка: неизвестный идентификатор datA
*pt = data // ошибка: нет точки с запятой
}
Ошибки, связанные с использованием конкретных параметров шаблона, нельзя выявить до того, как шаблон использован. Например, шаблон min сам по себе не содержит ошибок, однако использование его с типами, для которых операция '<' не определена, приведёт к ошибке:
struct A
{
int a;
};
A obj1, obj2;
min( obj1, obj2 );
Если ввести операцию '<' до первого использования шаблона, то ошибка будет устранена. Такпроявляетсягибкостьшаблоновв C++:
friend inline bool operator< ( const A& a1, const A& a2 ) { return a1.a < a2.a; }
min( obj1, obj2 );