您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

三分钟让你了解C++中的类模板的概念和意义

时间:2019-09-16 11:23:14  来源:  作者:

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

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

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

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

2、类模板:

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

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

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

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

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

3、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 };

4、类模板的应用:

  • 只能显示指定具体类型,无法自动推导;
  • 使用具体类型 < Type > 定义对象;

代码示例:

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

4、类模板:

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

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

  • 从类模板通过具体类型产生不同的类;
  • 编译器将类模板当做一个模子,这个模子可以产生许多实实在在的类;
  • 在声明的地方对类模板代码本身进行编译;
  • 在使用的地方对参数替换后的代码进行编译;

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

#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、第二次编译是使用类模板时针对每个成员函数独立编译;

6、类模板的工程应用:

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

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

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

  • 将类模板的成员函数实现放到类模板的外部实现;
  • 以上三条规则不是 C++ 和编译器的一部分,只是工程应用里习惯这样做,这样做后,代码可维护性、扩展性都会变好,因此建议遵守这三条规则;

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

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;
}
  • 三条规则不是硬性要求但是却可以带来很大好处;

8、小结:

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

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

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

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



Tags:C++ 类模板   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、在 C++ 中是否能够将泛型的思想应用于类?1、函数模板是将泛型编程的思想应用于函数,就有了函数模板;2、可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将...【详细内容】
2019-09-16  Tags: C++ 类模板  点击:(224)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(2)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(11)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(18)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(47)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(49)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(38)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条