C++中的类模板(Class Template)是一种用于创建通用类的机制,它允许我们编写与类型无关的类,从而使代码更加泛型化和重用性更高。通过使用类模板,我们可以在不改变代码的情况下处理不同的数据类型。
一、类模板的基本语法
template <typename T>
class ClassName {
// 类的成员变量和函数
};
template
:声明这是一个模板。<typename T>
:定义模板参数,T
是一个占位符,表示类型。
示例:
template <typename T>
class MyClass {
public:
MyClass(T value) : data(value) {}
void display() const {
std::cout << data << std::endl;
}
private:
T data;
};
二、类模板的使用
当我们需要使用类模板时,需要在类名后面指定实际的类型参数。
示例:
int main() {
MyClass<int> intObj(10);
intObj.display(); // 输出:10
MyClass<std::string> strObj("Hello");
strObj.display(); // 输出:Hello
return 0;
}
三、类模板的成员函数定义
类模板的成员函数可以在类内或类外定义。
类外定义示例:
template <typename T>
class MyClass {
public:
MyClass(T value);
void display() const;
private:
T data;
};
template <typename T>
MyClass<T>::MyClass(T value) : data(value) {}
template <typename T>
void MyClass<T>::display() const {
std::cout << data << std::endl;
}
注意:在类外定义成员函数时,需要在函数名前加上template <typename T>
,并在类名后加上<T>
。
四、类模板的特化
1. 全特化
针对特定类型提供特殊实现。
// 通用模板
template <typename T>
class MyClass {
// 通用实现
};
// 针对int类型的特化
template <>
class MyClass<int> {
// 针对int的实现
};
2. 部分特化
对一部分模板参数进行特化。
template <typename T>
class MyClass<T*> {
// 针对指针类型的实现
};
五、类模板的继承
类模板可以继承自普通类或另一个类模板。
template <typename T>
class Base {
// 基类内容
};
template <typename T>
class Derived : public Base<T> {
// 派生类内容
};
六、类模板与友元
在类模板中声明友元时,需要注意模板参数的使用。
template <typename T>
class MyClass {
friend void friendFunction<>(MyClass<T>);
// ...
};
七、示例:实现一个通用的数组类
template <typename T>
class Array {
public:
Array(int size) : size(size) {
data = new T[size];
}
~Array() {
delete[] data;
}
T& operator[](int index) {
return data[index];
}
private:
T* data;
int size;
};
int main() {
Array<int> intArray(5);
for (int i = 0; i < 5; ++i) {
intArray[i] = i * 10;
}
for (int i = 0; i < 5; ++i) {
std::cout << intArray[i] << " "; // 输出:0 10 20 30 40
}
return 0;
}
八、注意事项
- 模板的实现通常放在头文件中:因为模板是在编译时实例化的,所以实现需要在头文件中可见。
- 不能对模板参数类型进行自动推导:使用类模板时,必须显式指定模板参数类型。
- 编译器错误信息可能较复杂:模板错误可能导致难以理解的编译错误信息,需要耐心调试。
九、总结
类模板是C++提供的强大工具,能够让我们编写通用的、类型无关的代码。通过类模板,可以提高代码的重用性,减少重复劳动。在使用过程中,需要熟悉模板的语法和特性,以充分发挥其优势。