STL里面的很多容器,都是用类模板技术实现的。以vector为例,说明如何使用类模板技术来实现。

  1 //1.myvector.h文件
  2 #ifndef MYVECTOR_H
  3 #define MYVECTOR_H
  4
  5 #include <iostream>
  6 using namespace std;
  7
  8 template<typename T>
  9 class Myvector
 10 {
 11     friend ostream& operator<<<T>(ostream& out,Myvector<T>& obj);
 12 public:
 13     Myvector(int size);//构造函数
 14     Myvector(Myvector<T>&);//拷贝构造函数
 15     ~Myvector();//析构函数
 16
 17 public:
 18     Myvector<T>& operator=(const Myvector<T>& obj);
 19     T& operator[](int index);
 20     int getlen(){return my_len;}
 21
 22 private:
 23     T*  my_space;
 24     int my_len;
 25 };
 26
 27 #endif
 28
 29
 30
 31 //2.myvector.cpp文件
 32 #include <iostream>
 33 #include "myvector.h"
 34
 35 using namespace std;
 36
 37 //构造函数
 38 template<typename T>
 39 Myvector<T>::Myvector(int size)
 40 {
 41     my_len=size;
 42     my_space=new T[my_len];
 43     if(my_space==NULL)
 44     {
 45         cout<<"调用构造函数 分配内存失败!"<<endl;
 46         return;
 47     }
 48 }
 49
 50 //拷贝构造函数,深拷贝。拷贝构造函数也是构造函数,一开始my_len,my_space的值都是没有的(随机数),不存在释放什么的,全是要靠自己复制才会有
 51 template <typename T>
 52 Myvector<T>::Myvector(Myvector<T>& obj)
 53 {
 54     my_len=obj.my_len;
 55     my_space=new T[my_len];
 56
 57     for(int i=0;i<my_len;i++)
 58     {
 59         my_space[i]=obj.my_space[i];
 60     }
 61
 62 }
 63
 64 //析构函数
 65 template<typename T>
 66 Myvector<T>::~Myvector()
 67 {
 68     if(my_space!=NULL)
 69     {
 70         delete [] my_space;
 71         my_space=NULL;
 72         my_len=0;
 73     }
 74 }
 75
 76 //重载"[]"操作符
 77 template<typename T>
 78 T& Myvector<T>::operator[](int index)
 79 {
 80     return this->my_space[index];
 81 }
 82
 83
 84 //重载"="操作符
 85 template<typename T>
 86 Myvector<T>& Myvector<T>::operator=(const Myvector<T>& obj)
 87 {
 88     if(my_space!=NULL)
 89     {
 90         delete [] my_space;
 91         my_space = NULL;
 92     }
 93
 94     my_len=obj.my_len;
 95     for(int i=0;i<my_len;i++)
 96     {
 97         my_space[i]=obj.my_space[i];
 98     }
 99
100     return *this;
101 }
102
103
104 //重载"<<"运算符
105 template<typename T>
106 ostream& operator<<(ostream& out,Myvector<T>& obj)
107 {
108     for(int i=0;i<obj.my_len;i++)
109     {
110         out<<obj.my_space[i]<<" ";
111     }
112     return out;
113 }
114
115
116
117 //main.cpp文件
118 #include <iostream>
119 #include"myvector.cpp"
120
121 using namespace std;
122
123 int main()
124 {
125     Myvector<int> v1(10);
126     for(int i=0;i<v1.getlen();i++)
127     {
128         v1[i]=i;
129     }
130     cout<<v1<<endl;
131
132
133     Myvector<int> v2=v1;
134     cout<<v2<<endl;
135
136
137     Myvector<int> v3(v1);
138     cout<<v3<<endl;
139
140
141     return 0;
142 }

以上是操作只能在myvector里面存储一般的数据类型,如int,double,char等,存储自定义的Teacher类型时,则要注意:

假如Teacher类型定义如下:

class Teacher
{
public:
Teacher(int a=30,char* n="Zhang")
{
age=a;
strcpy(name,n);
}
void printT()
{
cout<<age<<" "<<name<<endl;
}

private:
int age;
char name[20];
};

1.myvector存储这种自定义的类型时,需要重载和"="和"<<"操作符。

2.上面的Teacher类型中的name占20个字节,如多定义成char *name则需要考虑到深拷贝个浅拷贝的问题,需要重载拷贝构造函数。

转载于:https://www.cnblogs.com/jswu-ustc/p/8525280.html

用类模板实现容器存储普通数据类型(类似于STL里面的vector)相关推荐

  1. 用类模板实现容器存储自定义数据类型(类似于STL里面的vector)

    上一节里面已经提到了,用类模板存储自定义的数据类型,如Teacher类型时,需要重载Teacher类的拷贝构造函数,"="操作符,"<<"操作符,特 ...

  2. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...

    本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...

  3. 深圳大学计软《面向对象的程序设计》实验15 函数模板和类模板

    A. 有界数组模板类(类模板) 题目描述 编写有界数组模板BoundArray(即检查对数组元素下标引用并在下标越界时终止程序的执行),能够存储各种类型的数据.要求实现对数组进行排序的方法sort,及 ...

  4. C++模板:类模板和类模板的友元【C++模板】(57)

    类模板 Stack 类 类模板 格式 类模板的应用 类模板的多文件实现 类模板的友元 类模板中的友元在.h 类模板中的友元在.cpp hpp STL入门 类模板 Stack 类 我们先给出我们之前实现 ...

  5. C++类模板template <class T>简单使用方法

    一个简单的例子 两个数比大小 如果两个数都是int类型 class Compare_int { public :Compare(int a,int b){x=a;y=b;}int max( ){ret ...

  6. 函数模板和类模板的使用

    函数模板 //交换 int 变量的值 void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //交换 float 变量的值 v ...

  7. C++类模板 template class T详细使用方法

    C++类模板 template <class T>详细使用方法 类模板与函数模板的定义和使用类似. 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: cl ...

  8. 友元函数,友元类,类模板

    C++提供友元机制,允许外部类和函数访问类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元类(或友元函数),使其具有类成员函数的访问权限.但友元本身不是类的成员,它不属于任何类. 优点: ...

  9. 模板学习(2)----类模板

    类模板 模板的作用我们已经知道了,类模板的作用就是建立一个可以公用的类,这个类模板里面的成员及其数据类型不用制定,同样是由一个虚拟的类型来表示的.类模板中的数据成员以及成员函数的参数和返回值都可以进行 ...

最新文章

  1. shell中exec解析
  2. Gogs-Windows Server下搭建Git服务器
  3. linux lvm snapshot lvm 快照 逻辑卷 快照
  4. OVS DPDK--Ring端口配置(五)
  5. python四十八:多态
  6. 转Java工程师成神之路
  7. 【转】心目中的编程高手
  8. 原 水质监测系统解决方案
  9. 计算机网络 | 网络基础 :网络协议,协议分层,数据封装与分用,地址管理,字节序
  10. 在.NET Core中处理一个接口多个不同实现的依赖注入问题
  11. 多线程中抛异常的这个面试题你会吗?
  12. 达拉草201771010105《面向对象程序设计(java)》第十周学习总结
  13. 基于算符优先文法的逆波兰表达式及计算
  14. java给xyz大小排序_Java Collection - 002 排序
  15. unity 字体 素材_unity中文字体制作工具
  16. 微软应用商店Ubuntu 20.04 LTS打开0x8007019e错误解决
  17. 如何在React.js文件中设置标签的背景图片
  18. 蓝牙怎么调声音大小_苹果蓝牙耳机
  19. python response_python修改微信和支付宝步数
  20. 二零年的十一月开始 努力做个极简的人

热门文章

  1. MySQL这几本书,初学者必看!
  2. FPGA基于SFP光口实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持
  3. Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引
  4. 错误——由于ssh配置启动不了yarn
  5. 如何选择PLC?主要从这8个方面入手
  6. 为文本文档 设置 快捷键
  7. 用一个简单的例子说明如何使用S函数进行Simulink建模
  8. 汇编语言 DOSBOX的安装与masm的汇编
  9. 苹果“泰坦计划”迎来新掌舵人,软件定义汽车是大势所趋
  10. 【git】拉取修改别人pr与代理设置