- •Приложение г Лекция 1. Элементы Языка си Используемые символы
 - •Константы
 - •Идентификаторы
 - •Ключевые слова
 - •Использование комментариев в тексте программы
 - •Лекция 2. Типы данных и их объявление
 - •Категории типов данных
 - •Целый тип данных
 - •Данные вещественного типа
 - •Указатели
 - •Операции разадресации и адреса
 - •Переменные перечислимого типа
 - •Лекция 3. Выражения и присваивания Операнды и операции
 - •Преобразования при вычислении выражений
 - •Операции отрицания и дополнения
 - •Операция sizeof
 - •Мультипликативные операции
 - •Аддитивные операции
 - •Операции сдвига
 - •Поразрядные операции
 - •Логические операции
 - •Операция последовательного вычисления
 - •Условная (тернарная) операция
 - •Операции увеличения и уменьшения
 - •Простое присваивание
 - •Составное присваивание
 - •Приоритеты операций и порядок вычислений
 - •Побочные эффекты
 - •Преобразование типов
 - •Лекция 3. Операторы
 - •Оператор выражение
 - •Пустой оператор
 - •Составной оператор
 - •Оператор if
 - •Оператор switch
 - •Оператор break
 - •Оператор while
 - •Оператор do while
 - •Оператор for
 - •Сумма чисел от 1 до 100
 - •Микрожизнь
 - •Оператор continue
 - •Оператор return
 - •Оператор goto
 - •Лекция 4. Массивы
 - •Поиск минимума, сортировка
 - •Ввод-вывод, обнуление
 - •Двумерный массив
 - •Лекция 5. Структуры
 - •Объединения (смеси)
 - •Поля битов
 - •Переменные с изменяемой структурой
 - •Определение объектов и типов
 - •Лекция 6. Инициализация данных
 - •Определение и вызов функций
 - •Ссылки как псевдонимы переменных
 - •Ссылки в качестве параметров функции
 - •Ссылка в качестве возвращаемого значения
 - •Передача массивов
 - •Прототип
 - •Указатели на функцию
 - •Рекурсия
 - •Предварительная инициализация параметров функции
 - •Функции с переменным числом параметров
 - •Передача параметров функции main
 - •Исходные файлы и объявление переменных
 - •Объявления функций
 - •Время жизни и область видимости программных объектов
 - •Лекция 7. Инициализация глобальных и локальных переменных
 - •Методы доступа к элементам массивов
 - •Указатели на многомерные массивы
 - •Операции с указателями
 - •Массивы указателей
 - •Лекция 8. Динамические объекты
 - •1. Выделение памяти в соответствие с типом указателя
 - •2. Выделение памяти под нетипизированный указатель
 - •Лекция 9. Динамическое создание и уничтожение массивов
 - •Директивы Препроцессора
 - •Директива #include
 - •Директива #define
 - •Директива #undef
 - •Лекция 10. Условные директивы препроцессора
 - •Линейный односвязный список
 - •Лекция 11. Объектно-ориентированный подход к программированию
 - •Ссылки на Себя
 - •Инициализация
 - •Копирующий конструктор
 - •Очистка
 - •Законченный Класс
 - •Доступ к членам
 - •Статические Члены
 - •Лекция 12. Наследование
 - •Перегрузка Операций
 - •Операции Преобразования
 - •Стандартный ввод/вывод
 - •Форматируемый вывод
 - •Манипуляторы
 - •Ввод-вывод двоичных данных
 - •Ввод/вывод с диска
 - •Ввод/вывод для типов данных, определенных пользователем
 - •Шаблоны функций
 - •Шаблоны классов
 - •Лекция 14. Библиотека stl
 - •Итераторы
 - •Алгоритмы
 - •Контейнеры
 - •Функциональные объекты
 - •Пример. Работа с контейнером vector
 - •Пример 2. Алгоритмы и функциональные объекты
 - •Лекция 15. Обработка исключительных ситуаций
 - •Лекция 16. Rtti и приведение типов
 - •Операция typeid
 
Операции Преобразования
Функция член X::operator T(), где T — имя типа, определяет преобразование из X в T. Например, можно определить тип tiny (крошечный), который может иметь значение только в диапазоне 0...63, но все равно может свободно сочетаться в целыми в арифметических операциях:
class tiny {
char v;
int assign(int i)
{ return v = (i&~63) ? (printf("ошибка диапазона"), 0) : i; }
public:
tiny(int i) { assign(i); }
tiny(tiny &i) { v = i.v; }
int operator=(tiny &i) { return v = i.v; }
int operator=(int i) { return assign(i); }
operator int() { return v; }
};
Диапазон значения проверяется всегда, когда tiny инициализируется int, и всегда, когда ему присваивается int. Одно tiny может присваиваться другому без проверки диапазона. Чтобы разрешить выполнять над переменными tiny обычные целые операции, определяется tiny::operator int(), неявное преобразование из int в tiny. Всегда, когда в том месте, где требуется int, появляется tiny, используется соответствующий ему int. Например:
tiny c1 = 2;
tiny c2 = 62;
tiny c3 = c2 - c1; // c3 = 60
tiny c4 = c3; // нет проверки диапазона (необязательна)
int i = c1 + c2; // i = 64
c1 = c2 + 2 * c1; // ошибка диапазона: c1 = 0 (а не 66)
c2 = c1 -i; // ошибка диапазона: c2 = 0
c3 = c2; // нет проверки диапазона (необязательна)
Пример
Добавим в класс PasSetоперацию объединения множеств "+".
class PasSet {
// …………………………………………………….
friend PasSet operator + (const PasSet &, const PasSet &);
};
PasSet operator + (const PasSet &a, const PasSet &b)
{
PasSet c;
for (int i=0;i<32; i++)
c.data[i]=a.data[i] | b.data[i];
return c;
}
Лекция 13. Переопределение ввода-вывода на языке С++
Стандартный ввод/вывод
С++ предоставляет четыре предварительно определенных потоковых объекта:
cin стандартный ввод;
cout стандартный вывод;
cerr стандартный вывод ошибок;
clog полностью буферизованная версия cerr;
Есть возможность перенаправить эти стандартные потоки из и на другие устройства и файлы.
Оператор поразрядного сдвига влево <<, применительно к операциям с потоками, называется оператором вставки или оператором «поместить в», а оператор поразрядного сдвига вправо >> — называется оператором извлечения или оператором «прочитать из».
Класс istream включает перекрываемые определения для оператора >>, используемого со стандартными типами [int, long, double, float, char*(строка)]. Таким образом, предложение cin >> x; вызывает соответствующую функцию оператора >> для istream cin, определенного в iostream.h и использует ее для направления этого входного потока в позицию памяти, представляемую переменной х. Аналогично, класс ostream имеет перекрываемые определения для оператора <<, который разрешает с помощью предложения cout << x; посылать значение x в ostream cout для вывода.
Эти функции оператора возвращают ссылку на соответствующий классовый тип потока (например, ostream&) наряду с перемещением данных. Это позволяет расположить в цепочку несколько таких операторов для ввода и вывода последовательности символов:
int i=0, x=243; double d=0;
cout << "Значение x равно " << x << '\n';
cin >> i >> d; //ввод с клавиатуры int, пробел, затем double
Вторая строка будет выводить на дисплей: «Значение x равно 243», а затем будет идти новая строка. Следующее предложение будет игнорировать пробел, читать и преобразовывать клавишные символы в целое число и помещать его в i, игнорировать следующий пробел, читать и преобразовывать следующие клавишные символы в double и помещать их в d.
Следующая программа просто копирует cin в cout. При отсутствии изменения направления она копирует ввод с клавиатуры на экран:
// COPYKBD.CPP Выводит на экран ввод с клавиатуры
#include <iostream.h>
int main()
{
char ch;
while (cin >> ch)
cout << ch;
}
Примечание. Эта программа просто сохраняет каждый вводимый символ в переменной ch, а затем выводит значение ch на экран.
