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

往期回顾:

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

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

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


 C++ 入门第十二天:模板(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++ 中的一种强大的功能,它使得我们可以编写通用的代码。

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

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

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值