for(i=0; i<100; i++ ) intarray[i] = i;
for(i=0; i<100; i++) cout << intarray[i] << " ";
cout << '\n';
cout << "Массив double-значений: ";
for(i=0; i<10; i++) doublearray[i] = (double) i/3;
for(i=0; i<10; i++) cout << doublearray[i] << " ";
cout << '\n';
cout << "Массив по умолчанию: ";
for(i=0; i<10; i++) defarray[i] = i;
for(i=0; i<10; i++) cout << defarray[i] << " ";
cout << '\n';
return 0;
}
Обратите особое внимание на эту строку:
template <class AType=int, int size=10>
class atype {
Здесь параметр AType по умолчанию заменяется типом int, а параметр size по умолчанию устанавливается равным числу 10. Как показано в этой программе, объекты класса atype можно создать тремя способами:
■ путем явного задания как типа, так и размера массива;
■ задав явно лишь тип массива, при этом его размер по умолчанию устанавливается равным 10 элементам;
■ вообще без задания типа и размера массива, при этом он по умолчанию будет хранить элементы типа int, а его размер по умолчанию устанавливается равным 10.
Использование аргументов по умолчанию (особенно типов) делает шаблонные классы еще более гибкими. Тип, используемый по умолчанию, можно предусмотреть для наиболее употребительного типа данных, позволяя при этом пользователю ваших классов задавать при необходимости нужный тип данных.
Подобно шаблонным функциям можно создавать и специализации обобщенных классов. Для этого используется конструкция template<>, которая работает по аналогии с явно задаваемыми специализациями функций. Рассмотрим пример.
// Демонстрация специализации класса.
#include <iostream>
using namespace std;
template <class T>
class myclass {
T x;
public:
myclass(T a) {
cout << "В теле обобщенного класса myclass.\n";
x = a;
}
T getx() { return x; }
};
// Явная специализация для типа int.
template <>
class myclass<int> {
int x;
public:
myclass(int a) {
cout << "В теле специализации myclass<int>.\n";
x = a * a;
}
int getx() { return x; }
};
int main()
{
myclass<double> d(10.1);
cout << "double: " << d.getx() << "\n\n";
myclass<int> i(5);
cout << "int: " << i.getx() << "\n";
return 0;
}
При выполнении данная программа отображает такие результаты.
В теле обобщенного класса myclass.
double: 10.1
В теле специализации myclass<int>.
int: 25
В этой программе обратите особое внимание на следующую строку.
template <>
class myclass<int> {
Она уведомляет компилятор о том, что создается явная int-специализация класса myclass. Тот же синтаксис используется и для любого другого типа специализации класса.
Явная специализация классов расширяет диапазон применения обобщенных классов, поскольку она позволяет легко обрабатывать один или два специальных случая, оставляя все остальные варианты для автоматической обработки компилятором. Но если вы заметите, что у вас создается слишком много специализаций, то тогда, возможно, лучше вообще отказаться от создания шаблонного класса.
Глава 17: Обработка исключительных ситуации
Эта глава посвящена обработке исключительных ситуаций. Исключительная ситуация (или исключение) — это ошибка, которая возникает во время выполнения программы. Используя С++-подсистему обработки исключительных ситуаций, с такими ошибками вполне можно справляться. При их возникновении во время работы программы автоматически вызывается так называемый обработчик исключений. Теперь программист не должен обеспечивать проверку результата выполнения каждой конкретной операции или функции вручную. В этом-то и состоит принципиальное преимущество системы обработки исключений, поскольку именно она "отвечает" за код обработки ошибок, который прежде приходилось "вручную" вводить в и без того объемные программы.