你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++——类模板的概念学习

[复制链接]
gaosmile 发布时间:2020-8-26 22:15
一、类模板的引出:
1、在c++中是否能够将泛型的思想应用在类上呢?
我们在前面的两篇文章里面,对函数模板有了一个清楚的认识,作为类比学习,当然泛型的思想是可以应用到类上的。
2、类模板:
  • 一些类主要用于存储和组织数据元素
  • 类中数据组织的方式和数据元素的具体类型无关
  • 如:数组类,链表类,Stack类,Queue类等等
  • c++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能

3、C++中的模板:
以相同的方式处理不同的类型
在类声明前使用template进行标识
template < typename T >//T表示泛指类型

class Operator
{
   public:
      T op(T a , T b);
};
4、类模板的应用
  • 只能显示指定具体类型,无法自动推导(我们的函数模板是可以实现自动推导具体类型的)

//使用具体类型"<Type>"定义对象
Operator<int> op1;
Operator<string> op2;

int i = op1.op(1,2);
string s = op2.op("txp","C++");
  
  • 声明的泛指类型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;
    }
};

string operator-(string& l, string& r)// 全局函数方式重载 - 操作符,编译通过;先类内部、再全局
{
    return "Minus";
}

int main()
{
    Operator<int> op1;
   
    cout << op1.add(1, 2) << endl;
   
    Operator<string> op2; // 第二次使用类模板时进行编译,但是并不是对所有模板中的函数进行了第二次编译,是分步编译的,首先编译的是构造函数,此时用的是默认的,没有问题,这里编译通过;
   
    cout << op2.add("Txp", "C++") << endl;
    cout << op2.minus("Txp", "C++") << endl; // 如果没有定义全局的重载 - 操作符的函数时,字符串相减没有定义,报错;这里报错展示出来是为了证明类模板编译也是经过了两次编译;这里编译器针对 minus() 函数进行第二次编译;定义全局的重载 - 操作符函数后,打印 Minus ;
   
    return 0;
}


输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
3
TxpC++
Minux

5、类模板的工程应用
  • 类模板必须在头文件中定义
  • 类模板不能分开实现在不同的文件中
  • 类模板外部定义的成员函数需要加上模板<>声明

代码实践:
Operator.h头文件:
#ifndef _OPERATOR_H_
#define _OPERATOR_H_

template < typename T >
class Operator
{
public:
    T add(T a, T b);
    T minus(T a, T b);
    T multiply(T a, T b);
    T divide(T a, T b);
};

template < typename T >
T Operator<T>::add(T a, T b)
{
    return a + b;
}


template < typename T >
T Operator<T>::minus(T a, T b)
{
    return a - b;
}


template < typename T >
T Operator<T>::multiply(T a, T b)
{
    return a * b;
}


template < typename T >
T Operator<T>::divide(T a, T b)
{
    return a / b;
}

#endif
test.cpp文件:
#include <iostream>
#include <string>
#include "Operator.h"

using namespace std;


int main()
{
    Operator<int> op1;
   
    cout << op1.add(1, 2) << endl;
    cout << op1.multiply(4, 5) << endl;
    cout << op1.minus(5, 6) << endl;
    cout << op1.divide(10, 5) << endl;
   
    return 0;
}


输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
3
20
-1
2

二、总结:
  • 泛型编程的思想可以应用于类
  • 类模板以相同的方式处理不同的类型的数据
  • 类模板非常适用于编写数据结构相关的代码
  • 类模板在使用时只能显示指定类型

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

收藏 评论0 发布时间:2020-8-26 22:15

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版