C++ 模板
在本文中,您将了解 C++ 中的模板。您将学习使用模板的强大功能进行泛型编程。
模板是 C++ 的强大功能,它允许您编写通用程序。简单来说,您可以使用模板创建单个函数或类来处理不同的数据类型。
为了代码的可重用性和程序的灵活性,模板通常用于较大的代码库中。
模板的概念可以以两种不同的方式使用:
- 函数模板
- 类模板
函数模板
函数模板的工作方式与普通函数类似,但有一个关键区别。
单个函数模板可以同时处理不同的数据类型,但单个普通函数只能处理一组数据类型。
通常,如果您需要对两种或多种类型的数据执行相同的操作,您可以使用函数重载来创建两个具有所需函数声明的函数。
但是,更好的方法是使用函数模板,因为您可以编写更少且可维护的代码来执行相同的任务。
如何声明函数模板?
函数模板开始从 template
关键字开始,随后跟着 <>
之间的模板参数,再之后是函数声明。
template <typename T>
T functionName(T parameter1, T parameter2, ...) {
// code
}
在上面的代码中, T
是一个可以接受不同数据类型(int、float)的模板参数,而 typename
是一个关键字。
当将一种数据类型的参数传递给 someFunction( )
时,编译器会为给定的数据类型生成新版本的 someFunction()
。
示例 1:查找最大数的函数模板
使用函数模板实现显示两个数字中最大的程序。
#include <iostream>
using namespace std;
// template function
template <class T>
T Large(T n1, T n2)
{
return (n1 > n2) ? n1 : n2;
}
int main()
{
int i1, i2;
float f1, f2;
char c1, c2;
cout << "Enter two integers:\n";
cin >> i1 >> i2;
cout << Large(i1, i2) <<" is larger." << endl;
cout << "\nEnter two floating-point numbers:\n";
cin >> f1 >> f2;
cout << Large(f1, f2) <<" is larger." << endl;
cout << "\nEnter two characters:\n";
cin >> c1 >> c2;
cout << Large(c1, c2) << " has larger ASCII value.";
return 0;
}
输出
Enter two integers: 5 10
10 is larger.
Enter two floating-point numbers: 12.4 10.2
12.4 is larger.
Enter two characters: z Z
z has larger ASCII value.
在上面的程序中, Large()
定义了一个接受两个参数 n1
和 n2
的函数模板数据类型 T
。 T
表示该参数可以是任何数据类型。
Large()
函数使用简单的条件操作返回两个参数中最大的一个。
在 main()
函数内部,声明了三种不同的数据类型的变量: int
, float
和 char
。然后将变量作为普通函数传递给函数模板 Large()
。
在运行时,当一个整数被传递给模板函数时,编译器知道它必须生成一个 Large()
函数来接受 int
参数。
类似地,当传递浮点数据和字符数据时,它知道参数数据类型并相应地生成 Large()
函数。
这样,仅使用一个函数模板就替换了三个相同的普通函数,并且您的代码可维护性更好。
示例 2:使用函数模板交换数据
使用函数模板交换数据的程序。
#include <iostream>
using namespace std;
template <typename T>
void Swap(T &n1, T &n2)
{
T temp;
temp = n1;
n1 = n2;
n2 = temp;
}
int main()
{
int i1 = 1, i2 = 2;
float f1 = 1.1, f2 = 2.2;
char c1 = 'a', c2 = 'b';
cout << "Before passing data to function template.\n";
cout << "i1 = " << i1 << "\ni2 = " << i2;
cout << "\nf1 = " << f1 << "\nf2 = " << f2;
cout << "\nc1 = " << c1 << "\nc2 = " << c2;
Swap(i1, i2);
Swap(f1, f2);
Swap(c1, c2);
cout << "\n\nAfter passing data to function template.\n";
cout << "i1 = " << i1 << "\ni2 = " << i2;
cout << "\nf1 = " << f1 << "\nf2 = " << f2;
cout << "\nc1 = " << c1 << "\nc2 = " << c2;
return 0;
}
输出
Before passing data to function template.
i1 = 1 i2 = 2
f1 = 1.1 f2 = 2.2
c1 = a c2 = b
After passing data to function template.
i1 = 2 i2 = 1
f1 = 2.2 f2 = 1.1
c1 = b c2 = a
在这个程序中,不是通过传递值来调用函数,而是通过引用发出调用。
类模板
与函数模板一样,您也可以为通用类操作创建类模板。
如何声明类模板?
template <class T>
class className {
private:
T var;
... .. ...
public:
T functionName(T arg);
... .. ...
};
在上面的声明中, T
是模板参数,它是所用数据类型的占位符。
在类体内部,成员变量 var
和成员函数 someOperation()
都是类型 T
。
如何创建类模板对象?
要创建类模板对象,需要在创建时在 <>
内部定义数据类型。
className<dataType> classObject;
例如:
className<int> classObject;
className<float> classObject;
className<string> classObject;
示例 3:使用 Class 模板的简单计算器
使用类模板对两个数字进行加减乘除的程序
#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
的私有成员: num1
和 num2
,以及一个用于初始化成员的构造函数。
它还包含公共成员函数,用于计算数字的加、减、乘和除,返回用户定义的数据类型的值。同样, displayResult()
将最终输出显示到屏幕上的函数。
在 main()
函数,两个不同的 Calculator
对象 intCalc
和 floatCalc
分别针对数据类型 int
和 float
创建。这些值是使用构造函数初始化的。
请注意,我们在创建对象时使用了 <int>
和 <float>
。这些告诉编译器用于创建类的数据类型。
这将为 int
和 float
分别创建一个类定义,然后相应地使用它们。
然后,调用两个对象的 displayResult()
函数,它执行计算器操作并显示输出。