C++ - 泛性编程类模板的概念_什么是泛性函数?(1)

-> 在类声明前使用template进行标识。

-> 用于说明类中使用的泛指类型T。

代码示例:类模板

template < typename T >
class Operator
{
public:
    T op(T a, T b);
};

类模板注意点:

-> 只能显示指定具体类型,无法自动推导。

-> 使用具体类型定义对象。

Operator<int> op1;
Operator<string> op2;
int i = op1.op(1,2);
string s = op2.op("D.T.","Software");

-> 声明的泛指类型T可以出现在类模板的任意地方。

-> 会从类模板通过具体类型产生不同的类。

-> 在声明的地方对类模板代码本身进行编译。

-> 在使用的地方对参数替换后的代码进行编译。

代码示例:类模板初探

#include <iostream>
#include <string>
 
using namespace std;
 
//第一次对类模板进行编译
template < typename T >
class Operator
{
public:
    T add(T a, T b)
    {
        return a + b;
    }
    T minus(T a, T b)
    {
        return a - b;
    }
    T multiply(T a, T b)
    {
        return a * b;
    }
    T divide(T a, T b)
    {
        return a / b;
    }
};
 
int main()
{
    //第二次在使用的地方进行编译
    Operator<int> op1;
    
    cout << op1.add(1, 2) << endl;
    
    //第二次首先编译这里构造函数
    Operator<string> op2;
    
    //第二次编译针对add函数(第二次编译也是分阶段编译,理解不冲突)
    cout << op2.add("D.T.", "Software") << endl;
    //第二次针对minus编译时,发现字符串没有相减操作,编译器报错!!有了添加的重载字符串减法函数,编译器匹配
    cout << op2.minus("D.T", "Software") << endl;    //两个字符串不能相减
    
    return 0;
}

结果:类模板可以重载,但是两个字符串不能相减。

58-1.cpp: In instantiation of ‘T Operator<T>::minus(T, T) [with T = std::basic_string<char>]’:
58-1.cpp:46:38:   required from here
58-1.cpp:17:12: error: no match for ‘operator-’ (operand types are ‘std::basic_string<char>’ and ‘std::basic_string<char>’)
   return a - b;
58-1.cpp:在实例化'T Operator<T>::minus(T, T) :
58-1.cpp:17:12: error: 没有匹配'operator-'    

解决办法:添加一个“-”减号,操作符重载。

#include <iostream>
#include <string>
 
using namespace std;
 
//第一次对类模板进行编译
template < typename T >
class Operator
{
public:
    T add(T a, T b)
    {
        return a + b;
    }
    T minus(T a, T b)
    {
        return a - b;
    }
    T multiply(T a, T b)
    {
        return a * b;
    }
    T divide(T a, T b)
    {
        return a / b;
    }
};
 
//有这个函数编译器不报错
string operator-(string& l, string& r)    //重载字符串相减,为了解决编译第二阶段错误
{
    return "Minus";    //不为了实现功能
}
 
int main()
{
    //第二次在使用的地方进行编译
    Operator<int> op1;
    
    cout << op1.add(1, 2) << endl;
    
    //第二次首先编译这里构造函数
    Operator<string> op2;
    
    //第二次编译针对add函数(第二次编译也是分阶段编译,理解不冲突)
    cout << op2.add("D.T.", "Software") << endl;
    //第二次针对minus编译时,发现字符串没有相减操作,编译器报错!!有了添加的重载字符串减法函数,编译器匹配
    cout << op2.minus("D.T", "Software") << endl;    //两个字符串不能相减
    
    return 0;
}

结果:

3
D.T.Software    
Minus    

2.类模板的工程应用

-> 类模板必须在头文件中定义。

-> 类模板不能分开实现在不同的文件中。

-> 类模板外部定义的成员函数需要加上模板<>声明。

代码示例:

Operator.h:

#ifndef _OPERATOR_H_
#define _OPERATOR_H_
 
template < typename T >
class Operator
{
public:
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/372a3329149a09cdd01ab0b9029cb452.png)

![img](https://img-blog.csdnimg.cn/img_convert/ba177124ab74f6b67445932fadc84808.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/9748f65cc6dbb51817962377e00242e9.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/6ad4b562fcf1d4ed9fee1301f58221b2.png)

![img](https://img-blog.csdnimg.cn/img_convert/005afb8cc91d9f675c520d1591ca699a.png)

![img](https://img-blog.csdnimg.cn/img_convert/cb20328025d67f64daaee22a41c21c44.png)

![](https://img-blog.csdnimg.cn/img_convert/841e934e215dc3ebd00a7c876dbe5152.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.youkuaiyun.com/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


*既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.youkuaiyun.com/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值