找回密码
 register

QQ登录

只需一步,快速开始

查看: 15|回复: 1

[C++] 泛型是什么,C++泛型编程又是什么?

[复制链接]

[C++] 泛型是什么,C++泛型编程又是什么?

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:215
  • 打卡月天数:14
  • 打卡总奖励:213
  • 最近打卡:2025-06-14 16:42:29
Waylee

主题

0

回帖

2万

积分

仙帝

积分
22663
Waylee 2025-6-13 22:26 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

什么是泛型?

在计算机程序设计领域,为了避免因数据类型的不同而被迫重复编写大量相同业务逻辑的代码,人们发展了泛型及泛型编程技术。

那么,什么是泛型呢?本节就带领读者深度剖析一下这个问题。


泛型的实质

泛型,实质上就是不使用具体数据类型(例如 intdoublefloat 等),而是使用一种通用类型来进行程序设计的方法。该方法可以大规模地减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。


使用具体数据类型的麻烦之处

为了更好地说明使用具体数据类型有多麻烦,这里先举个例子:

假设客户需要一个函数,功能是返回两个 int 类型数据中较大的那个,很多读者自然而然会编写如下代码:

int maxt(int x, int y) {
    return (x > y) ? x : y;
}

可是没过几天,该用户又提出需要编写一个返回两个 double 类型数据中较大的那个,于是我们需要将之前的代码进行修改:

double maxt(double x, double y) {
    return (x > y) ? x : y;
}

之后,该用户又提出需要再编写一个能返回两个 char 类型数据中较大的那个……。

可以看到,只是因为数据类型不同,就迫使我们不得不把具有相同功能的代码写了若干遍,这样的实现方法简直令人崩溃。


泛型编程的解决方案

为了解决类似的问题,有聪明的人将代码修改成如下的样子:

T maxt(T x, T y) {
    return (x > y) ? x : y;
}

如此,当用户需要某个数据类型的 maxt 函数时,我们只需要把其中的 T 替换成用户需要的实际数据类型就行了。

那么,代码中的 T 是什么呢?很明显,这是一个占位符,更确切地说是一个类型占位符。也就是说,将来在 T 这个位置上的是一个真实、具体的数据类型,至于到底是哪个类型,完全取决于用户的需求。


泛型的概念定义

当然,如果硬要给 T 这种类型占位符也叫做一种数据类型,提供这种想法的发明者称它为泛型(generic type),而使用这种类型占位符的编程方式就被称为泛型编程

值得一提的是,既然泛型并不是真实的数据类型,那么使用泛型编写的代码也就不是真正的程序实体,只能算是一个程序实体的样板。因此,通常形象地将这种使用了泛型的代码称为模板,由模板生成实际代码的过程称为模板的具体实现

注意,类型占位符的替换工作不需要人为操控,可以完全交由计算机来完成,更准确地说,是交由编译器在编译阶段来完成模板的具体实现。


总结

总之一句话,泛型也是一种数据类型,只不过它是一种用来代替所有类型的“通用类型”。在 C++ 中,用以支持泛型应用的就是标准模板库 STL,它提供了 C++ 泛型设计常用的类模板和函数模板。

有关 STL 模板库,由于不是本节重点,这里不再赘述,后续章节会做详细介绍。

  • 打卡等级:热心大叔
  • 打卡总天数:215
  • 打卡月天数:14
  • 打卡总奖励:213
  • 最近打卡:2025-06-14 16:42:29
楼主
Waylee 楼主

主题

0

回帖

2万

积分

仙帝

积分
22663
Waylee 2025-6-13 22:31 | 显示全部楼层 | Google Chrome | Windows 10
#include <iostream>
using namespace std;
class cals {
public:
    int add(int a, int n) {
        return a + n;
    }
    double add(double a, double n) {
        return a + n;
    }
};

template<typename T>
T maxt(T x, T y) {
    return x > y ? x : y;
}
int main()
{
    // 使用模板处理整数类型
    int x = 5, y = 8;
    cout << "较大的整数是:" << maxt(x, y) << endl;

    // 使用模板处理浮点数类型
    double a = 3.14, b = 2.718;
    cout << "较大的浮点数是:" << maxt(a, b) << endl;

    // 使用模板处理字符类型
    char c1 = 'A', c2 = 'Z';
    cout << "较大的字符是:" << maxt(c1, c2) << endl;

    // 使用模板处理字符串类型
    string s1 = "apple", s2 = "banana";
    cout << "较大的字符串是:" << maxt(s1, s2) << endl;

    return 0;
}
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |网站地图|天天打卡

GMT+8, 2025-6-14 17:39 , Processed in 0.100129 second(s), 5 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表