更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

你知道C++中类模板的概念和意义吗?

  • 发布:C++培训
  • 来源:问答库
  • 时间:2020-07-28 15:13

一、在 C++ 中是否能够将泛型的思想应用于类?

1、函数模板是将泛型编程的思想应用于函数,就有了函数模板;

2、可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将泛型的思想应用于一系列的函数,就得到了函数模板,当然也有很多的类模板;

3、类模板就是将泛型思想应用于 C++ 中的类而得到的新概念;

二、类模板:

1、一些类主要用于存储和组织数据元素;

类模板就是为了数据结构而诞生的;

2、类中数据组织的方式和数据元素的 具体类型无关;

3、如:数组类、链表类、Stack 类、Queue 类等;

C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需实现的功能;

三、C++ 中的类模板:

1、以相同的方式处理不同的类型;

2、在类声明前使用 template 进行标识;

3、< typename T > 用于说明类中使用的泛指类型 T;

代码示例:

1 template < typename T >

2 class Operator // class 表明将泛型编程应用于类

3 {

4 public:

5 T op(T a, T b) // T 在使用类模板定义具体对象的时候关心,其它时候不关心;

6 };

四、类模板的应用:

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

使用具体类型 < Type > 定义对象;

代码示例:

1 Operator<int> op1;

2 Operator<string> op2;

3 int i = op1.op(1, 20);

4 string s = op2.op("D.T.", "Software");

五、类模板:

1、声明的泛指类型 T 可以出现在类模板的任意地方;

2、编译器对类模板的处理方式和函数模板相同;

从类模板通过具体类型产生不同的类;

编译器将类模板当做一个模子,这个模子可以产生许多实实在在的类;

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

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

六、类模板初探编程实验:

#include <iostream>

#include <string>

using namespace std;

template < typename T >

class Operator // 要是用这个类模板有一个前提条件,即当前的 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; // 3;

Operator<string> op2; // 第二次使用类模板时进行编译,但是并不是对所有模板中的函数进行了第二次编译,是分步编译的,首先编译的是构造函数,此时用的是默认的,没有问题,这里编译通过;

cout << op2.add("D.T.", "Software") << endl; // D.T.Software;这里编译器针对 add() 函数进行第二次编译;

cout << op2.minus("D.T", "Software") << endl; // 未有定义全局的重载 - 操作符的函数时,字符串相减没有定义,报错;这里报错展示出来是为了证明类模板编译也是经过了两次编译;这里编译器针对 minus() 函数进行第二次编译;定义全局的重载 - 操作符函数后,打印 Minus ;

return 0;

}

1、编译器对类模板第一次编译针对类模板本身代码进行编译;

2、第二次编译是使用类模板时针对每个成员函数独立编译;

七、类模板的工程应用:

1、类模板必须在头文件中定义;

2、类模板不能分开实现在不同的文件中;

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

将类模板的成员函数实现放到类模板的外部实现;

以上三条规则不是 C++ 和编译器的一部分,只是工程应用里习惯这样做,这样做后,代码可维护性、扩展性都会变好,因此建议遵守这三条规则;

八、模板类的工程应用编程实验:

1、头文件(名字和类名一样) 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) // add() 是 Operator 类模板的;

{

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

2、头文件的应用;

#include <iostream>

#include <string>

#include "Operator.h"

using namespace std;

int main()

{

Operator<int> op1;

cout << op1.add(1, 2) << endl; // 3;

cout << op1.multiply(4, 5) << endl; // 20;

cout << op1.minus(5, 6) << endl; // -1;

cout << op1.divide(10, 5) << endl; // 2;

return 0;

}

三条规则不是硬性要求但是却可以带来很大好处;

九、小结:

1、泛型编程的思想可以应用于类;

2、类模板以相同的方式处理不同类型的数据;

3、类模板非常适用于编写数据结构相关的代码;

4、类模板在使用时只能显示指定类型;

此文为作者学习唐佐林老师的学习笔记,仅为交流共享之用。版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C语言八大排序算法是哪八种?
下一篇:C++的this是什麽意思?C++ this详解

空指针到底是什么意思?

a[i] = i++ 到底对不对?

C++培训哪家好?全方位对比机构

C/C++中的必须熟记的基础知识

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省