C++入门教程:第五篇 - 模板编程基础

C++入门教程:第五篇 - 模板编程基础

模板是C++的强大特性之一,它允许在编译时创建通用代码,从而增强程序的灵活性和可重用性。模板可以用于函数和类,使得代码能够适应不同的数据类型。本文将深入探讨C++中的函数模板和类模板的定义与使用。

1. 函数模板

函数模板允许你编写与数据类型无关的通用函数。通过模板,可以为不同的数据类型生成相应的函数,实现代码的复用。

1.1 函数模板的基本语法

函数模板的定义包括模板声明和函数体。模板声明使用template关键字,后跟一个或多个模板参数。

1.1.1 基本函数模板

以下示例展示了一个简单的函数模板,用于交换两个值:


cpp

#include <iostream>

using namespace std;

// 函数模板
template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 10, y = 20;
    swap(x, y);
    cout << "x: " << x << ", y: " << y << endl;

    double a = 1.1, b = 2.2;
    swap(a, b);
    cout << "a: " << a << ", b: " << b << endl;

    return 0;
}

cpp

1.1.2 带有多个模板参数的函数模板

函数模板可以使用多个模板参数。例如,以下模板用于计算两个不同类型值的最大值:


cpp

#include <iostream>

using namespace std;

// 函数模板
template <typename T, typename U>
T maximum(T a, U b) {
    return (a > b) ? a : b;
}

int main() {
    cout << "Maximum: " << maximum(10, 20.5) << endl;
    cout << "Maximum: " << maximum(10.5, 5) << endl;

    return 0;
}

cpp

2. 类模板

类模板允许你定义与数据类型无关的类。类模板的主要作用是创建可用于不同数据类型的通用类。

2.1 类模板的基本语法

类模板的定义包括模板声明和类体。模板声明中使用template关键字,后跟一个或多个模板参数。

2.1.1 基本类模板

以下示例展示了一个简单的类模板,用于存储一个数据值:


cpp

#include <iostream>

using namespace std;

// 类模板
template <typename T>
class Box {
private:
    T value;
public:
    // 构造函数
    Box(T val) : value(val) {}

    // 成员函数
    T getValue() {
        return value;
    }

    void setValue(T val) {
        value = val;
    }
};

int main() {
    Box<int> intBox(123);
    cout << "Integer Box Value: " << intBox.getValue() << endl;

    Box<string> strBox("Hello Template");
    cout << "String Box Value: " << strBox.getValue() << endl;

    return 0;
}

cpp

2.1.2 类模板的成员函数

类模板的成员函数可以在类外部定义,语法如下:


cpp

#include <iostream>

using namespace std;

// 类模板
template <typename T>
class Calculator {
private:
    T value;
public:
    Calculator(T val);

    T add(T other);
};

// 类模板构造函数的定义
template <typename T>
Calculator<T>::Calculator(T val) : value(val) {}

// 类模板成员函数的定义
template <typename T>
T Calculator<T>::add(T other) {
    return value + other;
}

int main() {
    Calculator<int> calc(10);
    cout << "Sum: " << calc.add(20) << endl;

    return 0;
}

cpp

3. 模板特化

模板特化允许你为特定的数据类型提供不同的实现。模板特化包括全特化和偏特化。

3.1 完全特化

完全特化提供了模板的具体实现,用于特定的数据类型。例如,以下是一个针对int类型的类模板完全特化:


cpp

#include <iostream>

using namespace std;

// 原始模板
template <typename T>
class Printer {
public:
    void print(T value) {
        cout << "Value: " << value << endl;
    }
};

// 完全特化
template <>
class Printer<int> {
public:
    void print(int value) {
        cout << "Integer Value: " << value << endl;
    }
};

int main() {
    Printer<double> doublePrinter;
    doublePrinter.print(3.14);

    Printer<int> intPrinter;
    intPrinter.print(42);

    return 0;
}

cpp

3.2 偏特化

偏特化允许你为模板参数的某些特定组合提供不同的实现。例如,以下是一个针对特定数据类型组合的类模板偏特化:


cpp

#include <iostream>

using namespace std;

// 原始模板
template <typename T, typename U>
class Pair {
private:
    T first;
    U second;
public:
    Pair(T a, U b) : first(a), second(b) {}

    void display() {
        cout << "First: " << first << ", Second: " << second << endl;
    }
};

// 偏特化
template <typename T>
class Pair<T, T> {
private:
    T value1;
    T value2;
public:
    Pair(T a, T b) : value1(a), value2(b) {}

    void display() {
        cout << "Both values: " << value1 << " and " << value2 << endl;
    }
};

int main() {
    Pair<int, double> p1(1, 3.14);
    p1.display();

    Pair<int, int> p2(5, 10);
    p2.display();

    return 0;
}

cpp

4. 总结

本文介绍了C++中的模板编程基础,包括函数模板和类模板的定义与使用,模板特化的基本概念。模板是C++中的一个强大特性,它使得代码更加通用、灵活,并且能够适应不同的数据类型。在下一篇教程中,我们将深入探讨C++中的标准模板库(STL),包括容器、算法和迭代器的使用。

希望这篇文章对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。我们下篇文章见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值