C++ 入门12:模板(Template)

往期回顾:

C++ 入门09:友元函数和友元类-CSDN博客

C++ 入门10:继承和派生类-CSDN博客

C++ 入门11:虚函数和多态-CSDN博客


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 对象,并调用了 getValuesetValue 函数。

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++ 中的一种强大的功能,它使得我们可以编写通用的代码。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

相关推荐
色空大师几秒前
23种设计模式
java·开发语言·设计模式
PandaCave8 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
萝卜兽编程12 分钟前
优先级队列
c++·算法
yuwinter13 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
Bruce小鬼13 分钟前
QT文件基本操作
开发语言·qt
2202_7544215419 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热26 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
red_redemption35 分钟前
自由学习记录(23)
学习·unity·lua·ab包
懷淰メ35 分钟前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm1 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j