H模版.cpp

前言:模版(Template)是一把开启强大代码复用和通用编程的 “金钥匙”。它允许程序员编写灵活、高效且可扩展的代码,以应对复杂多变的项目需求。 

目录

模板

解决代码重复的 “神器”

函数模板

一个顶十个

类模板:打造通用数据容器

创建类模板

使用类模板

模板特化

给特殊类型特殊待遇

综合实践案例:万能计算器

创建函数模板

创建类模板

使用万能计算器

总结


模板

解决代码重复的 “神器”

在 C++ 编程中,有没有遇到过这样的烦恼?写一个函数交换两个变量的值,却要为不同数据类型重复写多个类似的函数。像下面这样:

void swapInt(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

void swapFloat(float &a, float &b) {
    float temp = a;
    a = b;
    b = temp;
}

这种重复劳动简直就像在 “车轮大战” 中不断造轮子。别担心,模板闪亮登场啦!它就像一个神奇的万能模具,能轻松搞定不同数据类型的函数或类。

函数模板

一个顶十个

创建函数模板

// 我是万能函数模板,能处理各种类型的数据哦
template 
void swap(T &a, T &b) {
    T temp = a; // 把a的值存到temp里
    a = b;      // 把b的值给a
    b = temp;   // 把temp(也就是原来的a)的值给b
    std::cout << "交换完成啦!" << std::endl;
}

template 就是告诉编译器:“嘿,我要用模板啦,T就是一个占位符,代表任意类型哦。”

使用函数模板:

int main() {
    int x = 5, y = 3;
    double a = 3.14, b = 2.718;

    std::cout << "交换前:x = " << x << ", y = " << y << std::endl;
    swap(x, y); // 调用模板函数,T是int类型
    std::cout << "交换后:x = " << x << ", y = " << y << std::endl;

    std::cout << "交换前:a = " << a << ", b = " << b << std::endl;
    swap(a, b); // 调用模板函数,T是double类型
    std::cout << "交换后:a = " << a << ", b = " << b << std::endl;

    return 0;
}

输出结果:

交换前:x = 5, y = 3
交换完成啦!
交换后:x = 3, y = 5
交换前:a = 3.14, b = 2.718
交换完成啦!
交换后:a = 2.718, b = 3.14

一个模板函数就像一个 “超级变形金刚”,能灵活应对各种类型的数据交换任务,是不是超方便?

类模板:打造通用数据容器

创建类模板

// 我是一个万能盒子,能装各种类型的数据哦
template 
class Box {
private:
    T value; // 存放的数据

public:
    // 构造函数,给盒子装数据
    Box(T val) : value(val) {
        std::cout << "盒子创建啦,数据装好咯!" << std::endl;
    }

    // 获取盒子中的数据
    T getValue() const {
        std::cout << "我要把数据给你啦!" << std::endl;
        return value;
    }

    // 设置盒子中的数据
    void setValue(T val) {
        value = val;
        std::cout << "数据更新啦!" << std::endl;
    }
};

使用类模板

int main() {
    // 创建一个装int的盒子
    Box intBox(42);
    std::cout << "intBox中的数据是: " << intBox.getValue() << std::endl;

    // 创建一个装double的盒子
    Box doubleBox(3.14159);
    std::cout << "doubleBox中的数据是: " << doubleBox.getValue() << std::endl;

    // 更新doubleBox中的数据
    doubleBox.setValue(2.71828);
    std::cout << "更新后的doubleBox中的数据是: " << doubleBox.getValue() << std::endl;

    return 0;
}

输出结果:

盒子创建啦,数据装好咯!
intBox中的数据是: 42
我要把数据给你啦!
盒子创建啦,数据装好咯!
doubleBox中的数据是: 3.14159
我要把数据给你啦!
数据更新啦!
更新后的doubleBox中的数据是: 2.71828
我要把数据给你啦!

类模板就像是一个神奇的 “百宝箱制造机”,能轻松为我们打造不同类型的通用数据容器。

模板特化

给特殊类型特殊待遇

有时候,对于某些特定类型,我们想给它特殊的处理。这时候就可以用模板特化啦。

  • 创建普通模板和特化模板

// 这是普通的盒子模板
template 
class Box {
public:
    void printType() const {
        std::cout << "这是一个普通盒子,装的是:";
    }
};

// 这是装int的特殊盒子
template <>
class Box {
public:
    void printType() const {
        std::cout << "这是一个装int的特殊盒子哦!" << std::endl;
    }
};

// 这是装double的特殊盒子
template <>
class Box {
public:
    void printType() const {
        std::cout << "这是一个装double的特殊盒子哦!" << std::endl;
    }
};
  • 使用模板特化

int main() {
    Box intBox;
    Box doubleBox;
    Box stringBox;

    intBox.printType();
    doubleBox.printType();
    stringBox.printType();

    return 0;
}

输出结果:

这是一个装int的特殊盒子哦!
这是一个装double的特殊盒子哦!
这是一个普通盒子,装的是:

通过模板特化,就像给不同类型的数据量身定制专属的 “服务”,让每个类型都能得到恰到好处的处理。

综合实践案例:万能计算器

下面,我们来创建一个万能计算器,它可以对不同类型的数值进行加减乘除运算。

创建函数模板

// 万能计算器的加法函数
template 
T add(T a, T b) {
    std::cout << "正在执行加法运算: " << a << " + " << b << " = ";
    return a + b;
}

// 万能计算器的减法函数
template 
T subtract(T a, T b) {
    std::cout << "正在执行减法运算: " << a << " - " << b << " = ";
    return a - b;
}

// 万能计算器的乘法函数
template 
T multiply(T a, T b) {
    std::cout << "正在执行乘法运算: " << a << " * " << b << " = ";
    return a * b;
}

// 万能计算器的除法函数
template 
T divide(T a, T b) {
    if (b != 0) {
        std::cout << "正在执行除法运算: " << a << " / " << b << " = ";
        return a / b;
    } else {
        std::cout << "错误:除数不能为零哦!" << std::endl;
        return 0;
    }
}

创建类模板

// 万能计算器类模板
template 
class Calculator {
private:
    T num1;
    T num2;

public:
    // 构造函数
    Calculator(T n1, T n2) : num1(n1), num2(n2) {
        std::cout << "万能计算器启动啦,已加载数字: " << num1 << " 和 " << num2 << std::endl;
    }

    // 执行加法运算
    T performAddition() {
        return add(num1, num2);
    }

    // 执行减法运算
    T performSubtraction() {
        return subtract(num1, num2);
    }

    // 执行乘法运算
    T performMultiplication() {
        return multiply(num1, num2);
    }

    // 执行除法运算
    T performDivision() {
        return divide(num1, num2);
    }
};

使用万能计算器

int main() {
    // 创建一个处理int类型数值的计算器
    Calculator intCalc(10, 3);
    std::cout << intCalc.performAddition() << std::endl;
    std::cout << intCalc.performSubtraction() << std::endl;
    std::cout << intCalc.performMultiplication() << std::endl;
    std::cout << intCalc.performDivision() << std::endl;

    std::cout << "------------------------" << std::endl;

    // 创建一个处理double类型数值的计算器
    Calculator doubleCalc(10.5, 3.2);
    std::cout << doubleCalc.performAddition() << std::endl;
    std::cout << doubleCalc.performSubtraction() << std::endl;
    std::cout << doubleCalc.performMultiplication() << std::endl;
    std::cout << doubleCalc.performDivision() << std::endl;

    return 0;
}

输出结果:

万能计算器启动啦,已加载数字: 10 和 3
正在执行加法运算: 10 + 3 = 13
正在执行减法运算: 10 - 3 = 7
正在执行乘法运算: 10 * 3 = 30
正在执行除法运算: 10 / 3 = 3
------------------------
万能计算器启动啦,已加载数字: 10.5 和 3.2
正在执行加法运算: 10.5 + 3.2 = 13.7
正在执行减法运算: 10.5 - 3.2 = 7.3
正在执行乘法运算: 10.5 * 3.2 = 33.6
正在执行除法运算: 10.5 / 3.2 = 3.28125

这个万能计算器案例充分展现了模板的强大。无论是整数还是小数,都能轻松处理,而且代码结构清晰,易于扩展。

总结

C++模板是C++中一个强大而灵活的特性,它可以帮助你编写通用、高效的代码。对于初学者来说,理解模板的基本概念和语法是第一步。通过不断实践和尝试,你会逐渐掌握模板的精髓,并将其应用到实际项目中,提升代码的质量和可维护性。

你可能感兴趣的:(26字母学习:C++入门篇,c++,算法,开发语言,后端,青少年编程,visual,studio,code)