C++入门——60s从0到1
类模板
当我们需要编写一个通用的类,它可以适用于多种类型的数据时,类模板就派上用场了。类模板允许我们定义一个类的基本结构,但是具体的类型将在实例化时指定。本文将详细介绍C++类模板的概念和使用方法。
类模板的定义
类模板的定义包含两部分:类模板的名称和类模板的参数表。类模板的名称是一个标识符,它与普通函数的名称有些类似。类模板的参数表是一个逗号分隔的列表,每个参数都可以是一个类型参数或一个模板参数包。
下面是一个简单的类模板的定义:
template <typename T> class MyClass { public: void print() { std::cout << "Hello, I'm a MyClass instance of type " << typeid(T).name() << std::endl; } };
在这个例子中,类模板的名称为`MyClass`,参数表只有一个类型参数`T`。这个类模板可以用来创建不同类型的对象,例如:
MyClass<int> myInt; // 创建一个整数类型的MyClass对象
MyClass<double> myDouble; // 创建一个双精度浮点数类型的MyClass对象
在实例化时,编译器会将类型参数`T`替换为具体的类型,例如`int`或`double`。这样就可以创建不同类型的对象了。
类模板的成员函数
类模板的成员函数与普通类的成员函数有些不同。在定义类模板的成员函数时,我们需要在函数头中使用template关键字来指定它是类模板的成员函数。此外,我们还可以在函数头中使用类模板的名称和参数表来表示该函数是类模板的一部分。
下面是一个示例代码:
template <typename T> class MyClass { public: void print() { std::cout << "Hello, I'm a MyClass instance of type " << typeid(T).name() << std::endl; } template <typename U> void add(U value) { data += value; } private: T data; };
在这个例子中,我们定义了一个名为`add`的成员函数,它接受一个类型为`U`的参数,并将其加到`data`成员变量上。由于`add`函数是类模板的一部分,因此它可以访问类模板的私有成员变量`data`。此外,由于`add`函数使用了另一个类型参数`U`,因此我们可以将其作为第二个模板参数传递给类模板。这样就可以在实例化时传递任意类型的值给`add`函数了。
类模板的特化
有时我们需要针对某个特定的类型对类模板进行特化处理。特化就是在原有的类模板基础上,为某个特定类型的参数创建一个新的版本。特化的语法如下:
template <typename T> class MyClass { ... }; // 原版类模板
template <> class MyClass<int> { ... }; // 特化版本针对int类型
在这个例子中,我们为整数类型`int`创建了一个特化的版本。这个特化版本的类名仍然是`MyClass`,但是它只适用于整数类型的参数。在特化版本中,我们可以覆盖或修改原版类模板中的任何成员函数或成员变量。这样就可以为特定类型的数据提供更加高效的实现方式了。