往期回顾:
C++ 入门09:友元函数和友元类-****博客
C++ 入门10:继承和派生类-****博客
C++ 入门11:虚函数和多态-****博客
C++ 入门12:模板(Template)
一、前言
在前面文章的学习中,我们掌握了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类,以及虚函数和多态。今天,我们将学习 C++ 中的模板。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。
二、模板(Template)
2.1、 什么是模板?
模板是C++中引入的一个非常强大的特性,它提供了一种机制来创建泛型编程的框架。通过使用模板,程序员可以编写与类型无关的代码,这意味着相同的代码结构可以用于多种不同的数据类型,而无需为每种数据类型重写代码。模板极大地提高了代码的重用性、灵活性和可维护性。模板主要分为两大类:函数模板和类模板。
2.2、 函数模板
(1)什么是函数模板?
函数模板是一种能够编写一个函数定义,该函数可以与多种数据类型一起工作的技术。在定义函数模板时,程序员可以定义一个或多个模板参数来表示数据类型,这些参数在函数被实例化时会被具体的类型所替换。通过这种方式,函数模板可以处理不同类型的数据,而无需为每种数据类型编写单独的函数。
(2)声明和定义函数模板
函数模板的声明和定义与普通函数的声明和定义类似,但需要在函数声明前加上template<typename T>
(或template<class T>
,两者在大多数情况下可以互换使用)来引入模板参数。这里的T
是一个占位符,代表将要被替换的数据类型。
语法:
template <typename T>
返回类型 函数名(参数列表) {
// 函数体
}
其中,typename T
是模板参数,表示数据类型。
示例:
我们定义一个函数模板 maxValue
,用于返回两个值中的较大者。
#include <iostream>
using namespace std;
template <typename T>
T maxValue(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << "Max of 3 and 7: " << maxValue(3, 7) << endl;
cout << "Max of 3.5 and 7.2: " << maxValue(3.5, 7.2) << endl;
cout << "Max of 'a' and 'z': " << maxValue('a', 'z') << endl;
return 0;
}
在这个示例中,我们定义了一个函数模板 maxValue
,它可以处理任意类型的数据。在 main
函数中,我们分别调用了 maxValue
函数,传入整数、浮点数和字符类型的数据。
2.3、 类模板
(1)什么是类模板?
类模板与函数模板类似,但它允许程序员定义一种可以处理多种数据类型的类。在定义类模板时,可以使用模板参数来表示类成员变量和成员函数所使用的数据类型。这使得类模板能够创建出具有相同操作但操作不同类型数据的对象。
(2)声明和定义类模板
类模板的声明和定义方式与普通类相似,但同样需要在类声明前加上template<typename T>
(或template<class T>
)来引入模板参数。
语法:
template <typename T>
class 类名 {
public:
// 成员变量
// 成员函数
};
示例:
我们定义一个类模板 Box
,用于存储一个值,并提供获取和设置该值的函数。
#include <iostream>
using namespace std;
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
void setValue(T v) {
value = v;
}
T getValue() {
return value;
}
};
int main() {
Box<int> intBox(123);
Box<double> doubleBox(45.67);
cout << "Integer Box: " << intBox.getValue() << endl;
cout << "Double Box: " << doubleBox.getValue() << endl;
intBox.setValue(456);
doubleBox.setValue(89.01);
cout << "Updated Integer Box: " << intBox.getValue() << endl;
cout << "Updated Double Box: " << doubleBox.getValue() << endl;
return 0;
}
在这个示例中,我们定义了一个类模板 Box
,它可以存储任意类型的数据。在 main
函数中,我们分别创建了存储整数和浮点数的 Box
对象,并调用了 getValue
和 setValue
函数。
2.4、 模板特化
(1)什么是模板特化?
模板特化是一种为模板参数提供特定类型实现的机制。在某些情况下,我们可能希望对某些特定类型的数据进行特殊处理,而不是使用模板的通用实现。这时,我们就可以通过模板特化来为这些特定类型提供定制化的实现。
模板特化可以是完全特化,也可以是偏特化。完全特化是指为模板的所有模板参数指定具体类型;而偏特化则是指为模板的部分模板参数指定具体类型,同时保留其他模板参数的通用性。
示例:
我们定义一个类模板 Printer
,用于打印不同类型的数据。对于 char*
类型,我们希望打印字符串而不是字符指针,因此我们使用模板特化进行处理。
#include <iostream>
using namespace std;
template <typename T>
class Printer {
public:
void print(T value) {
cout << "Value: " << value << endl;
}
};
// 对 char* 类型进行特化
template <>
class Printer<char*> {
public:
void print(char* value) {
cout << "String: " << value << endl;
}
};
int main() {
Printer<int> intPrinter;
Printer<double> doublePrinter;
Printer<char*> stringPrinter;
intPrinter.print(123);
doublePrinter.print(45.67);
stringPrinter.print("Hello, World!");
return 0;
}
在这个示例中,我们定义了一个类模板 Printer
,用于打印不同类型的数据。对于 char*
类型,我们使用模板特化进行处理,以打印字符串。
以上就是 C++ 程序的模板的基础知识点了。包括函数模板、类模板和模板特化。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!