Шаблоны классов С++
Шаблоны классов C++
В этом уроке мы узнаем о шаблонах классов в C++ с помощью примеров.
Шаблоны — это мощные функции C++, которые позволяют нам писать универсальные программы. Есть два способа реализации шаблонов:
- Шаблоны функций
- Шаблоны занятий
Подобно шаблонам функций, мы можем использовать шаблоны классов для создания одного класса для работы с различными типами данных.
Шаблоны классов очень удобны, так как они могут сделать наш код короче и более управляемым.
<час>Объявление шаблона класса
Шаблон класса начинается с ключевого слова template. за которым следует параметр(ы) шаблона внутри <> за которым следует объявление класса.
template <class T>
class className {
private:
T var;
... .. ...
public:
T functionName(T arg);
... .. ...
}; В приведенном выше объявлении T — это аргумент шаблона, который является заполнителем для используемого типа данных, и class ключевое слово.
Внутри тела класса переменная-член var и функция-член functionName() оба имеют тип T .
Создание объекта шаблона класса
После того как мы объявили и определили шаблон класса, мы можем создавать его объекты в других классах или функциях (таких как main() функция) со следующим синтаксисом
className<dataType> classObject; Например,
className<int> classObject;
className<float> classObject;
className<string> classObject; <час> Пример 1. Шаблоны классов C++
// C++ program to demonstrate the use of class templates
#include <iostream>
using namespace std;
// Class template
template <class T>
class Number {
private:
// Variable of type T
T num;
public:
Number(T n) : num(n) {} // constructor
T getNum() {
return num;
}
};
int main() {
// create object with int type
Number<int> numberInt(7);
// create object with double type
Number<double> numberDouble(7.7);
cout << "int Number = " << numberInt.getNum() << endl;
cout << "double Number = " << numberDouble.getNum() << endl;
return 0;
} Вывод
int Number = 7 double Number = 7.7
В этой программе. мы создали шаблон класса Number с кодом
template <class T>
class Number {
private:
T num;
public:
Number(T n) : num(n) {}
T getNum() { return num; }
}; Обратите внимание, что переменная num , аргумент конструктора n , а функция getNum() имеют тип T или иметь тип возвращаемого значения T . Это означает, что они могут быть любого типа.
В main() , мы реализовали шаблон класса, создав его объекты
Number<int> numberInt(7);
Number<double> numberDouble(7.7); Обратите внимание на коды Number<int>. и Number<double> в приведенном выше коде.
Это создает определение класса для каждого int и float , которые затем используются соответствующим образом.
Обязательно указывать тип при объявлении объектов шаблонов классов. В противном случае компилятор выдаст ошибку.
//Error
Number numberInt(7);
Number numberDouble(7.7); <час> Определение члена класса вне шаблона класса
Предположим, нам нужно определить функцию вне шаблона класса. Мы можем сделать это с помощью следующего кода:
template <class T>
class ClassName {
... .. ...
// Function prototype
returnType functionName();
};
// Function definition
template <class T>
returnType ClassName<T>::functionName() {
// code
} Обратите внимание, что код template <class T> повторяется при определении функции вне класса. Это необходимо и является частью синтаксиса.
Если мы посмотрим на код в Примере 1 , у нас есть функция getNum() который определен внутри шаблона класса Number .
Мы можем определить getNum() вне Number со следующим кодом:
template <class T>
class Number {
... .. ...
// Function prototype
T getnum();
};
// Function definition
template <class T>
T Number<T>::getNum() {
return num;
} <час> Пример 2. Простой калькулятор с использованием шаблонов классов
Эта программа использует шаблон класса для выполнения сложения, вычитания, умножения и деления двух переменных num1. и число2 .
Переменные могут быть любого типа, хотя мы использовали только int и float типы в этом примере.
#include <iostream>
using namespace std;
template <class T>
class Calculator {
private:
T num1, num2;
public:
Calculator(T n1, T n2) {
num1 = n1;
num2 = n2;
}
void displayResult() {
cout << "Numbers: " << num1 << " and " << num2 << "." << endl;
cout << num1 << " + " << num2 << " = " << add() << endl;
cout << num1 << " - " << num2 << " = " << subtract() << endl;
cout << num1 << " * " << num2 << " = " << multiply() << endl;
cout << num1 << " / " << num2 << " = " << divide() << endl;
}
T add() { return num1 + num2; }
T subtract() { return num1 - num2; }
T multiply() { return num1 * num2; }
T divide() { return num1 / num2; }
};
int main() {
Calculator<int> intCalc(2, 1);
Calculator<float> floatCalc(2.4, 1.2);
cout << "Int results:" << endl;
intCalc.displayResult();
cout << endl
<< "Float results:" << endl;
floatCalc.displayResult();
return 0;
} Вывод
Int results: Numbers: 2 and 1. 2 + 1 = 3 2 - 1 = 1 2 * 1 = 2 2 / 1 = 2 Float results: Numbers: 2.4 and 1.2. 2.4 + 1.2 = 3.6 2.4 - 1.2 = 1.2 2.4 * 1.2 = 2.88 2.4 / 1.2 = 2
В приведенной выше программе мы объявили шаблон класса Calculator. .
Класс содержит два закрытых члена типа T. :число1 &число2 и конструктор для инициализации членов.
У нас также есть add() , subtract() , multiply() и divide() функции с возвращаемым типом T . У нас также есть void функция displayResult() который выводит результаты других функций.
В main() , мы создали два объекта Calculator :один для int тип данных и другой для float тип данных.
Calculator<int> intCalc(2, 1);
Calculator<float> floatCalc(2.4, 1.2); Это побуждает компилятор создать два определения класса для соответствующих типов данных во время компиляции.
<час>Шаблоны классов C++ с несколькими параметрами
В C++ мы можем использовать несколько параметров шаблона и даже использовать аргументы по умолчанию для этих параметров. Например,
template <class T, class U, class V = int>
class ClassName {
private:
T member1;
U member2;
V member3;
... .. ...
public:
... .. ...
}; <час> Пример 3. Шаблоны C++ с несколькими параметрами
#include <iostream>
using namespace std;
// Class template with multiple and default parameters
template <class T, class U, class V = char>
class ClassTemplate {
private:
T var1;
U var2;
V var3;
public:
ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {} // constructor
void printVar() {
cout << "var1 = " << var1 << endl;
cout << "var2 = " << var2 << endl;
cout << "var3 = " << var3 << endl;
}
};
int main() {
// create object with int, double and char types
ClassTemplate<int, double> obj1(7, 7.7, 'c');
cout << "obj1 values: " << endl;
obj1.printVar();
// create object with int, double and bool types
ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
cout << "\nobj2 values: " << endl;
obj2.printVar();
return 0;
} Вывод
obj1 values: var1 = 7 var2 = 7.7 var3 = c obj2 values: var1 = 8.8 var2 = a var3 = 0
В этой программе мы создали шаблон класса с именем ClassTemplate. , с тремя параметрами, один из которых является параметром по умолчанию.
template <class T, class U, class V = char>
class ClassTemplate {
// code
}; Обратите внимание на код class V = char. . Это означает, что V является параметром по умолчанию, тип которого по умолчанию — char. .
Внутри ClassTemplate , мы объявляем 3 переменные var1 , var2 и var3 , каждый из которых соответствует одному из параметров шаблона.
class ClassTemplate {
private:
T var1;
U var2;
V var3;
... .. ...
... .. ...
}; В main() , мы создаем два объекта ClassTemplate с кодом
// create object with int, double and char types
ClassTemplate<int, double> obj1(7, 7.7, 'c');
// create object with double, char and bool types
ClassTemplate<double, char, bool> obj2(8, 8.8, false); Здесь
| Объект | Т | Н | В |
|---|---|---|---|
| obj1 | int | double | char |
| obj2 | double | char | bool |
Для obj1 , T = int , U = double и V = char .
Для obj2 , T = double , U = char и V = bool .
Язык C