C++入门教程:第五篇 - 模板编程基础
模板是C++的强大特性之一,它允许在编译时创建通用代码,从而增强程序的灵活性和可重用性。模板可以用于函数和类,使得代码能够适应不同的数据类型。本文将深入探讨C++中的函数模板和类模板的定义与使用。
1. 函数模板
函数模板允许你编写与数据类型无关的通用函数。通过模板,可以为不同的数据类型生成相应的函数,实现代码的复用。
1.1 函数模板的基本语法
函数模板的定义包括模板声明和函数体。模板声明使用template
关键字,后跟一个或多个模板参数。
1.1.1 基本函数模板
以下示例展示了一个简单的函数模板,用于交换两个值:
cpp
#include <iostream>
using namespace std;
// 函数模板
template <typename T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
swap(x, y);
cout << "x: " << x << ", y: " << y << endl;
double a = 1.1, b = 2.2;
swap(a, b);
cout << "a: " << a << ", b: " << b << endl;
return 0;
}
cpp
1.1.2 带有多个模板参数的函数模板
函数模板可以使用多个模板参数。例如,以下模板用于计算两个不同类型值的最大值:
cpp
#include <iostream>
using namespace std;
// 函数模板
template <typename T, typename U>
T maximum(T a, U b) {
return (a > b) ? a : b;
}
int main() {
cout << "Maximum: " << maximum(10, 20.5) << endl;
cout << "Maximum: " << maximum(10.5, 5) << endl;
return 0;
}
cpp
2. 类模板
类模板允许你定义与数据类型无关的类。类模板的主要作用是创建可用于不同数据类型的通用类。
2.1 类模板的基本语法
类模板的定义包括模板声明和类体。模板声明中使用template
关键字,后跟一个或多个模板参数。
2.1.1 基本类模板
以下示例展示了一个简单的类模板,用于存储一个数据值:
cpp
#include <iostream>
using namespace std;
// 类模板
template <typename T>
class Box {
private:
T value;
public:
// 构造函数
Box(T val) : value(val) {}
// 成员函数
T getValue() {
return value;
}
void setValue(T val) {
value = val;
}
};
int main() {
Box<int> intBox(123);
cout << "Integer Box Value: " << intBox.getValue() << endl;
Box<string> strBox("Hello Template");
cout << "String Box Value: " << strBox.getValue() << endl;
return 0;
}
cpp
2.1.2 类模板的成员函数
类模板的成员函数可以在类外部定义,语法如下:
cpp
#include <iostream>
using namespace std;
// 类模板
template <typename T>
class Calculator {
private:
T value;
public:
Calculator(T val);
T add(T other);
};
// 类模板构造函数的定义
template <typename T>
Calculator<T>::Calculator(T val) : value(val) {}
// 类模板成员函数的定义
template <typename T>
T Calculator<T>::add(T other) {
return value + other;
}
int main() {
Calculator<int> calc(10);
cout << "Sum: " << calc.add(20) << endl;
return 0;
}
cpp
3. 模板特化
模板特化允许你为特定的数据类型提供不同的实现。模板特化包括全特化和偏特化。
3.1 完全特化
完全特化提供了模板的具体实现,用于特定的数据类型。例如,以下是一个针对int
类型的类模板完全特化:
cpp
#include <iostream>
using namespace std;
// 原始模板
template <typename T>
class Printer {
public:
void print(T value) {
cout << "Value: " << value << endl;
}
};
// 完全特化
template <>
class Printer<int> {
public:
void print(int value) {
cout << "Integer Value: " << value << endl;
}
};
int main() {
Printer<double> doublePrinter;
doublePrinter.print(3.14);
Printer<int> intPrinter;
intPrinter.print(42);
return 0;
}
cpp
3.2 偏特化
偏特化允许你为模板参数的某些特定组合提供不同的实现。例如,以下是一个针对特定数据类型组合的类模板偏特化:
cpp
#include <iostream>
using namespace std;
// 原始模板
template <typename T, typename U>
class Pair {
private:
T first;
U second;
public:
Pair(T a, U b) : first(a), second(b) {}
void display() {
cout << "First: " << first << ", Second: " << second << endl;
}
};
// 偏特化
template <typename T>
class Pair<T, T> {
private:
T value1;
T value2;
public:
Pair(T a, T b) : value1(a), value2(b) {}
void display() {
cout << "Both values: " << value1 << " and " << value2 << endl;
}
};
int main() {
Pair<int, double> p1(1, 3.14);
p1.display();
Pair<int, int> p2(5, 10);
p2.display();
return 0;
}
cpp
4. 总结
本文介绍了C++中的模板编程基础,包括函数模板和类模板的定义与使用,模板特化的基本概念。模板是C++中的一个强大特性,它使得代码更加通用、灵活,并且能够适应不同的数据类型。在下一篇教程中,我们将深入探讨C++中的标准模板库(STL),包括容器、算法和迭代器的使用。
希望这篇文章对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。我们下篇文章见!