39类模板

简介: 39类模板

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`,但是它只适用于整数类型的参数。在特化版本中,我们可以覆盖或修改原版类模板中的任何成员函数或成员变量。这样就可以为特定类型的数据提供更加高效的实现方式了。

目录
相关文章
|
编译器 Linux C++
59 C++ - 类模板
59 C++ - 类模板
60 0
|
C++
60 C++ - 类模板的应用
60 C++ - 类模板的应用
31 0
|
4月前
|
算法 编译器 程序员
|
11月前
|
编译器 C++
类模板的三种表达方式
类模板的三种表达方式
50 0
|
编译器 C++
类模板总结
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
|
编译器 C++
C++函数模板与类模板
C++函数模板与类模板
79 0
|
编译器 C++
【C++】什么是函数模板/类模板?
1.什么是函数模板? 函数模板简单来说就是一个模板,与函数参数的类型无关,是一个模子,不是真正的函数,实例化的函数会根据实参的类型自动推导类型。
|
存储 编译器 C++
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(二)
本章将正式开始介绍C++中的模板,为了能让大家更好地体会到用模板多是件美事!我们将会举例说明,大家可以试着把自己带入到文章中,跟着思路去阅读和思考,真的会很有意思!如果你对网络流行梗有了解,读起来将会更有意思!
140 1
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(二)
|
算法 编译器 C++
C++模板(类模板)
C++模板(类模板)
109 0
|
编译器 C语言 C++
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(一)
本章将正式开始介绍C++中的模板,为了能让大家更好地体会到用模板多是件美事!我们将会举例说明,大家可以试着把自己带入到文章中,跟着思路去阅读和思考,真的会很有意思!如果你对网络流行梗有了解,读起来将会更有意思!
122 0
【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板(一)