- •Методическое материалы по курсу
- •Cанкт-Петербург
- •Оглавление
- •Введение.
- •Задание: Разобраться в коде и вывести на консоль еще одну фразу: "It's a first program"
- •Типы данных и правила их применения:
- •Операции
- •Управляющие операторы
- •Оператор цикла do-while
- •Задание: в данном примере реализуйте операции умножения и деления Оператор цикла for (;;)
- •Задание: к примеру добавьте перегруженную функцию для суммирования чисел типа double, и проверьте ее работу
- •Модульная организация программы
- •Массивы
- •Задание: добавьте еще один элемент в массив при инициализации и посмотрите его размерность. В цикле увеличьте значение всех элементов массива на 10 и напечатайте его заново. Работа со строками
- •Ссылочный тип данных
- •Задание: Объявить еще одну переменную-ссылку на I и, изменив ее значение, пронаблюдать, как изменилось значение переменной I Работа с файлами
- •Взаимодействие с ассемблером
- •Обработка ошибок и исключений
- •Директивы препроцессора: Макросы и Условные директивы
- •Структуры
- •Задание : Добавить в сруктуру еще одно данное (стоимость модели) типа int, в коде функции main() задать значение этого данного переменной–структуры, и напечатать его.
- •Объектно-ориентированное программирование (ооп)
- •Терминология ооп
- •Структура как простейший класс
- •Конструкторы и деструкторы
- •Перегрузка методов класса
- •Дружественные функции и классы
- •Указатель this
- •Перегрузка операций
- •Множественное наследование
- •Если осталось время – разобраться в иерархии классов и принципов построения
- •Список литературы
Взаимодействие с ассемблером
С помощью инструкции _asm можно объявить оператор или блок операторов на языке ассемблера, которые напрямую транслируются в машинные коды (\24ASM.CPP)
int main()
{
long l = 0; // Объявление переменной
cout << "l = " << l << endl;
_asm { // Блок ассемблерных команд
mov l, eax // Присвоение переменной значения регистра eax
}
cout << "l = " << l << endl; // Вывод нового значения переменной
return(0);
}
Обработка ошибок и исключений
Стандартный механизм обработки ошибок предполагает анализ ошибки в теле программы после вызова функции путем проверки возвращаемого ей значения. Это достаточно просто, наглядно, но создает проблемы при написании сложных программ, в которых присутствует множество вложенных функций (сложно отследить логику, какую часть операторов надо выполнять, а какую – нет при возникновении ошибки). Пример подобной обработки:
FILE *stream;
if ((stream = fopen( "data", "r" ))==NULL) // Если NULL–файл не открыт
cout << "File wasn't opened: " << strerror(errno); // Логика обработки
Механизм исключений, введенный в С++ позволяет упростить обработку ошибок. Программист определяет условие возникновения ошибки и создает (выбрасывает) исключение. При возникновении исключения нормальный ход программы прерывается и система ищет обработчик исключения данного типа или обработчик всех исключений. После его выполнения программа продолжает выполнение со следующего за обработчиком исключения оператора.(\25EXCEP)
int testfunc(int j, int i) // Тестовая функция
{
if (i == 0) // Определение условий для исключения
throw "Can be divizion by zero"; // создание исключения
return (j / i); // Нормальный ход программы
}
int main()
{
try { // Тело защищаемого блока
cout << "1 test : " << testfunc(1, 1) << endl;
cout << "2 test : " << testfunc(1, 0) << endl; // Здесь появится исключение
cout << "3 test : " << testfunc(0, 1) << endl;
}
catch (char* psz) { // Перехват исключения типа *char
cout << psz; // Логика обработки исключения: вывод сообщения
}
catch (...) { // Перехват исключения любого типа
cout << "Catched Any Exception"; // Логика обработки ...
}
return 0;
}
Директивы препроцессора: Макросы и Условные директивы
Директива #define , кроме определения констант, может задавать макросы, то есть препроцессор (работающий перед компилятором) заменит вхождение одних символов в программе на другие, например (\26PREPR)
#define SQUARE(x) x*x // Определение макроса для вычисления квадрата
…
int iresult = SQUARE(5); // Использование макроса, результат: iresult = 5*5;
Пользоваться этим нужно осторожно, использование этого макроса не всегда приводит к желаемому резуьтату:
int iresult = SQUARE( x+1 ); // Результат не (x+1)*(x+1), а x+1*x+1
В макросах можно использовать не только переменные, но и вызов различных функций…
#define PRINTLN(x) cout<<(x)<<endl // Макрос выводящий переменную на консоль
…
PRINTLN(iresult); // Использование макроса вывода на консоль
Условные директивы позволяют задавать компилятору правила, при
которых тот будет компилировать различные участки кода, например, задавать разный типа для переменной:
#define SHORTVAR // Определение условной директивы для препроцессора
…
#ifdef SHORTVAR // Проверка определения директивы
short i = SQUARE(5); // Компиляция одних операторов, если директива определена
#else
long i = SQUARE(1000); // Компиляция других операторов, если нет
#endif
PRINTLN(i); // Использование макроса вывода на консоль
Для работы с условиями используются директивы: #define #ifdef #else #elif #endif #undef #ifndef
