首页 > 编程语言 >C++类模板(模板类)

C++类模板(模板类)

时间:2023-05-05 23:24:12浏览次数:64  
标签:C++ 关键字 数组 可变 Pair 模板

参考资料:

C++类模板(模板类)详解 (biancheng.net)

 

人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动。

例如,在《C++运算符重载》一章中的《C++实现可变长度的动态数组》一节中,我们实现了一个可变长的整型数组类,可能还需要可变长的 double 数组类,可变长的 CStudent 数组类,等等。如果要把类似于可变长整型数组类的代码都重写一遍,无疑非常麻烦。有了类模板的机制,只需要写一个可变长的数组类模板,编译器就会由该类模板自动生成整型、double 型等各种类型的可变长数组类了。

C++ 中类模板的写法如下:

template <类型参数表>
class 类模板名{
    成员函数和成员变量
};

类型参数表的写法如下:

class类塑参数1, class类型参数2, ...

 

 类模板中的成员函数放到类模板定义外面写时的语法如下:

template <类型参数表>
返回值类型  类模板名<类型参数名列表>::成员函数名(参数表)
{
    ...
}

 

 用类模板定义对象的写法如下:

类模板名<真实类型参数表> 对象名(构造函数实际参数表);

如果类模板有无参构造函数,那么也可以使用如下写法:

类模板名 <真实类型参数表> 对象名;

类模板看上去很像一个类。下面以 Pair 类模板为例来说明类模板的写法和用法。

实践中常常会碰到,某项数据记录由两部分组成,一部分是关键字,另一部分是值。关键字用来对记录进行排序和检索,根据关键字能查到值。例如,学生记录由两部分组成,一部分是学号,另一部分是绩点。要能根据学号对学生进行排序,以便方便地检索绩点,则学号就是关键字,绩点就是值。

下面的Pair类模板就可用来处理这样的数据记录:

#include <iostream>
#include <string>
using namespace std;
template <class T1,class T2>
class Pair{
    public:
        T1 key;  //关键字
        T2 value;  //值
        Pair(T1 k,T2 v):key(k),value(v) { };
        bool operator < (const Pair<T1,T2> & p) const;
};
template<class T1,class T2>
bool Pair<T1,T2>::operator < (const Pair<T1,T2> & p) const
//Pair的成员函数 operator <
{ //"小"的意思就是关键字小
    return key < p.key;
}
int main()
{
    Pair<string,int> student("Tom",19); //实例化出一个类 Pair<string,int>
    cout << student.key << " " << student.value;
    return 0;
}

 程序的输出结果是:
Tom 19

 

 

 

 

111111111

标签:C++,关键字,数组,可变,Pair,模板
From: https://www.cnblogs.com/xzit201802/p/17375649.html

相关文章

  • C++11生成随机数
    一、random_device类classrandom_device{public:typedefunsignedintresult_type;//constructor构造函数explicitrandom_device(conststd::string&token="");//propertiesstaticresult_typemin();staticresult_typemax()......
  • 【模板】堆 题解
    题目传送门一道小根堆模板题。在做这道题之前,我们先介绍一下小根堆是什么。我们定义小根堆是一种对于任何一个父结点的权值总是小于或等于子节点权值的完全二叉树。因此,不难看出,一个小根堆的堆顶(这棵树的根节点)应该是这个堆(树)中权值最小的结点。简单介绍完了小根堆,我们再介绍......
  • C++中的多线程编程和同步机制
    C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能。本文将介绍多线程编程和同步机制的基本概念和使用方法。多线程编程基础在C++中,使用<thread>库来创建和管理线程。线程可以通过函数、成员函数或者Lambda表达式来实现。以下是一个使......
  • 求最大值(函数模板)
    一、问题描述:两个类如下设计:类Time有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载-(减号)的成员函数。类Date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。要求设计一个函数模板template<classT>Tma......
  • C++容器(vector、deque、list、map)
    (1)vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取)。数组尾部添加或删除元素非常迅速。但在中部或头部就比较费时。*代码演示:*取:at在下标越界时会抛出异常,我们能捕获异常进行处理;而[]下标越界会让程序直接终止;构造函数:cbegin,cend,crbegin,cren......
  • c++打卡练习(21)
    分钱:五块钱,换成一块、五毛、一毛,有几种换法?流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ intyuan[6]={0,10,20,30,40,50}; intjiao[11]={0,5,10,15,20,25,30,35,40,45,50}; inti,j,k,m=1; for(i=0;i<=50;i++){ for(j=0;j<11;j++){ for(k=0;k......
  • eclipse注释模板及格式化模板导入方法
    格式化模板导入步骤  1.点击Window->Preference->Java->CodeStyle->Formatter2.点击右侧Import选择*.xml模板文件导入即可3.如果需要对模板进行修改,可点击Edit编辑即可4.模板示例:1.<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>2.<profilesvers......
  • [CodeForces-545A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个正整数\(n\),表示汽车数量。给定一个\(n\timesn\)阶矩阵\(A\),第\(i\)行\(j\)列上的数字表示\(i\)车与\(j\)车的对撞情况。\(\begin{aligned}\begin{cases}A_{i,j}=-1&i,j\text{车没......
  • C++
    动物世界1、实现Mammal类的方法2、由Mammal类派生出Dog类,在Dog类中增加itsColor成员(COLOR类型)3、Dog类中增加以下方法:constructors:Dog()、Dog(intage)、Dog(intage,intweight)、Dog(intage,COLORcolor)、Dog(intage,intweight,COLORcolor)、~Dog()accessors......
  • [CodeForces-545A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个正整数\(n\),表示汽车数量。给定一个\(n\timesn\)阶矩阵\(A\),第\(i\)行\(j\)列上的数字表示\(i\)车与\(j\)车的对撞情况。\(\begin{aligned}\begin{cases}A_{i,j}=-1&i,j\text{车没......