Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

17.2.5. Використання в шаблонних класах аргументів за замовчуванням

Шаблонний клас може за замовчуванням визначати аргумент, що є відповідним узагальненому типу. Наприклад, внаслідок оголошення такої template-специфікації

template <class aType=int> class myClass { // ...

буде використаний тип int, якщо під час створення об'єкта класу myClass відсутнє задавання будь-якого типу.

Для аргументів, які не представляють тип в template-специфікації, також дозволяється задавати значення за замовчуванням. Вони використовуються у випадку, якщо під час реалізації класу значення для такого аргументу безпосередньо не вказане. Аргументи за замовчуванням для "нетипових" параметрів задаються за допомогою синтаксису, аналогічного використовуваному під час задавання аргументів за замовчуванням для параметрів функцій.

Розглянемо ще одну версію класу безпечного масиву, у якому використовуються аргументи за замовчуванням як для типу даних, так і для розміру масиву.

Код програми 17.10. Демонстрація механізму використання шаблонних аргументів за замовчуванням

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

// Тут параметр aType за замовчуванням приймає тип int, а параметр

// size за замовчуванням встановлюється таким, що дорівнює 10.

template <class aType=int, int size=10> class atype {

aType aMas[size]; // Через параметр size передається розмір масиву.

public:

atype() { register int i; for(i=0; i<size; i++) aMas[i] = i;}

aType &operator[](int i);

};

// Забезпечення контролю меж для класу atype.

template <class aType, int size>

aType &atype<aType, size>::operator[](int i)

{

if(i<0 || i> size-1) {

cout << "Значення індексу " << i << " за межами масиву.\n";

exit(1);

}

return aMas[i];

}

int main()

{

atype<int, 100> intMas; // 100-елементний масив цілих чисел

atype<double> doubleMas; // 10-елементний масив double-значень

//(розмір масиву встановлено за замовчуванням)

atype<> defMas; // 10-елементний масив int-значень (розмір

// і тип int встановлені за замовчуванням)

int i;

cout << "Масив цілих чисел: ";

for(i=0; i<100; i++) intMas[i] = i;

for(i=0; i<100; i++) cout << intMas[i] << " ";

cout << "\n";

cout << "Масив double-значень: ";

for(i=0; i<10; i++) doubleMas[i] = (double) i/3;

for(i=0; i<10; i++) cout << doubleMas[i] << " ";

cout << "\n";

cout << "Масив за замовчуванням: ";

for(i=0; i<10; i++) defMas[i] = i;

for(i=0; i<10; i++) cout << defMas[i] << " ";

cout << "\n";

getch(); return 0;

}

Внаслідок виконання цієї програми на моніторі буде відображено такі результати:

Масив int-значень: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 99

Масив double-значень: 0 0.333333 0.666667 1 1.333333 1.666667 2 2.333333 2.666667 3

Масив за замовчуванням: 0 1 2 3 4 5 6 7 8 9

Зверніть особливу увагу на цей рядок:

template <class aType=int, int size=10> class atype {

У цьому записі параметр aType за замовчуванням замінюється типом int, а параметр size за замовчуванням встановлюється таким, що дорівнює числу 10. Як показано у наведеному вище коді програми, об'єкти класу atype можна створити трьома способами:

  • шляхом безпосереднього задавання як типу, так і розміру масиву;

  • задавши безпосередньо тільки тип масиву, при цьому його розмір за замовчуванням встановлюється таким, що дорівнює 10 елементам;

  • взагалі без задавання типу і розміру масиву, при цьому він за замовчуванням зберігатиме елементи типу int, а його розмір за замовчуванням встановлюється таким, що дорівнює 10.

Використання аргументів за замовчуванням (особливо типів) робить шаблонні класи ще гнучкішими. Тип, що використовується за замовчуванням, можна передбачити для найбільш вживаного типу даних, даючи змогу при цьому користувачу Ваших класів задавати у разі потреби потрібний тип даних.