Шаблоны классов С++
Шаблоны классов 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