В C++ поддерживаются комплексные типы данных с помощью комплексного класса, который определяется в <complex>. В C существуют встроенные комплексные типы данных, а их поддержка осуществляется с помощью заголовочного файла <complex.h>. Эти подходы различны и несовместимы.
Версия C отражает большую зависимость от непосредственных запросов вычислений, производящих числовые расчеты.
Пример 1
# include "complex.h"
complex c = 7.4; // инициализация 7.4+0i
complex d (8.5); // инициализация 8.5+0i
complex e (9.1,10.0);// инициализация 9.1+10.0i
complex f;
Указатель на void
В C++, как и в C, можно назначать указатель любого типа указателю на void, но в отличие от C, в C++ невозможно присвоить указателю на void указатель любого другого типа, если явно не привести их типы.
Пример 1
int ar[5] = {4,5,6,7,8};
int *pi;
void *pv;
pv = ar; // допускается в С и С++
pi = pv; // допускается в С, но неверно в С++
pi = (int*)pv; // допускается в С и С++
В C++ можно присваивать адрес объекта произвольного типа указателю на объект базового класса. В C – нельзя.
Альтернативное правописание
|
|
В C++ or или | – ключевые слова. А в стандарте С99 они определены как макросы, следовательно требуется включение заголовочного файла <ISO646.h>.
Поддержка расширенных символов
При работе с C++ имеется встроенный тип данных wchar_t, wchar_t – ключевое слово, а в стандарте С99 wchar_t определен в нескольких заголовочных файлах: <stddef.h> <stdlib.h> <wchar.h> <wctype.h>
В C++ реализуется поддержка ввода-вывода для расширенных символов с помощью заголовочного файла <iostream.h>. Стандарт С99 поддерживает многобайтные символы, что невозможно в C++.
Глава 14. Исключения и их обработка
Исключение – это некоторое действие, которое выполняется при наступлении нестандартных ситуаций.
Говоря о об исключениях в С++, рассмотрим одну из таких нестандартных ситуаций — деление на 0. Представьте, что мы работаем в программе, где вручную вносим много числовых данных. Далее, в результате каких-то расчетов программы, значение одной из переменных станет равным 0. А в следующей строке кода это значение выступает делителем. Конечно, это действие приведет к неизбежному закрытию программы и выходу из нее. А теперь представьте, какие чувства вы испытаете, когда полчаса вводите данные, работая в этой программе, и на каком-то этапе она просто перестает работать и закрывается, а все данные пропадают.
Пример 1
В переменную num2 необходимо записать значение 0 для понимания сути проблемы.
#include <iostream>;
using namespace std;
Int main()
{
setlocale(LC_ALL, "rus");
int num1;
int num2;
int var = 2; //управляющая переменная для while
while(var--)
{
cout << "Введите значение num1: ";
cin >> num1;
|
|
cout << "Введите значение num2: ";
cin >> num2;
cout << "num1 + num2 = " << num1 + num2 << endl;
cout << "num1 / num2 = " << num1 / num2 << endl;
cout << "num1 - num2 = " << num1 - num2 << endl;
cout << "=================================" << endl << endl;
}
cout << "Программа завершила работу!" << endl << endl;
return 0;
}
В программе цикл должен отработать два раза. В строке 12 мы передаем циклу значение переменной var и в этой же строке уменьшаем её на единицу, используя операцию декремента (var--). Но если в переменную num2 будет введено значение 0, мы увидим только результат сложения a + b, и программа завершит работу независимо от того, есть код ниже или нет, отработал цикл или нет.
Используя исключения, мы сможем избежать таких проблем. Чтобы «прикрутить» исключение к этому примеру, надо познакомиться со следующими командами С++: throw, try, catch. В исходном коде ниже исключение сработает так: программа получает конкретное указание от программиста — если значение определённой переменной в определённом участке кода (в try-блоке) будет равно 0, то в этом случае пусть генерируется исключение throw. Это исключение автоматически передастся catch -блоку в виде параметра и выполнится код этого блока.
Пример 2.
#include <iostream>;
using namespace std;
Int main()
{
setlocale(LC_ALL, "rus");
int num1;
int num2;
int var = 2;
while(var--)
{
cout << "Введите значение num1: ";
cin >> num1;
cout << "Введите значение num2: ";
cin >> num2;
cout << "num1 + num2 = " << num1 + num2 << endl;
cout << "num1 / num2 = ";
try //код, который может привести к ошибке, располагается тут
{
if (num2 == 0)
{
throw 123; //генерировать целое число 123
}
cout << num1 / num2 << endl;
}
catch(int i)//сюда передастся число 123
{
cout << "Ошибка №" << i << " - на 0 делить нельзя!!!!" << endl;
}
cout << "num1 - num2 = " << num1 - num2 << endl;
cout << "=================================" << endl << endl;
}
cout << "Программа завершила работу!" << endl << endl;;
return 0;
}
В этом коде сначала был определен try-блок. В нем располагается код, который потенциально может вызвать ошибку в работе программы, а именно ошибку в случае деления на 0. Задаем условие if — если num2 равно 0, то генерировать целое число 123, к примеру. В этом случае try-блок сразу прекращает выполнение дальнейших команд, а число 123 «падает» в catch. В нашем примере он выводит сообщение об ошибке. При этом программа продолжает работать и выполнять команды, размещенные ниже. Если же число num2 не будет равно нулю, то в try-блоке выполнится команда cout << num1 / num2 << endl;, а catch не сработает.
Приложение 1.