用类模板实现容器存储普通数据类型(类似于STL里面的vector)
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)相关推荐
- 用类模板实现容器存储自定义数据类型(类似于STL里面的vector)
上一节里面已经提到了,用类模板存储自定义的数据类型,如Teacher类型时,需要重载Teacher类的拷贝构造函数,"="操作符,"<<"操作符,特 ...
- java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...
本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...
- 深圳大学计软《面向对象的程序设计》实验15 函数模板和类模板
A. 有界数组模板类(类模板) 题目描述 编写有界数组模板BoundArray(即检查对数组元素下标引用并在下标越界时终止程序的执行),能够存储各种类型的数据.要求实现对数组进行排序的方法sort,及 ...
- C++模板:类模板和类模板的友元【C++模板】(57)
类模板 Stack 类 类模板 格式 类模板的应用 类模板的多文件实现 类模板的友元 类模板中的友元在.h 类模板中的友元在.cpp hpp STL入门 类模板 Stack 类 我们先给出我们之前实现 ...
- C++类模板template <class T>简单使用方法
一个简单的例子 两个数比大小 如果两个数都是int类型 class Compare_int { public :Compare(int a,int b){x=a;y=b;}int max( ){ret ...
- 函数模板和类模板的使用
函数模板 //交换 int 变量的值 void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //交换 float 变量的值 v ...
- C++类模板 template class T详细使用方法
C++类模板 template <class T>详细使用方法 类模板与函数模板的定义和使用类似. 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: cl ...
- 友元函数,友元类,类模板
C++提供友元机制,允许外部类和函数访问类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元类(或友元函数),使其具有类成员函数的访问权限.但友元本身不是类的成员,它不属于任何类. 优点: ...
- 模板学习(2)----类模板
类模板 模板的作用我们已经知道了,类模板的作用就是建立一个可以公用的类,这个类模板里面的成员及其数据类型不用制定,同样是由一个虚拟的类型来表示的.类模板中的数据成员以及成员函数的参数和返回值都可以进行 ...
最新文章
- shell中exec解析
- Gogs-Windows Server下搭建Git服务器
- linux lvm snapshot lvm 快照 逻辑卷 快照
- OVS DPDK--Ring端口配置(五)
- python四十八:多态
- 转Java工程师成神之路
- 【转】心目中的编程高手
- 原 水质监测系统解决方案
- 计算机网络 | 网络基础 :网络协议,协议分层,数据封装与分用,地址管理,字节序
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
- 多线程中抛异常的这个面试题你会吗?
- 达拉草201771010105《面向对象程序设计(java)》第十周学习总结
- 基于算符优先文法的逆波兰表达式及计算
- java给xyz大小排序_Java Collection - 002 排序
- unity 字体 素材_unity中文字体制作工具
- 微软应用商店Ubuntu 20.04 LTS打开0x8007019e错误解决
- 如何在React.js文件中设置标签的背景图片
- 蓝牙怎么调声音大小_苹果蓝牙耳机
- python response_python修改微信和支付宝步数
- 二零年的十一月开始 努力做个极简的人
热门文章
- MySQL这几本书,初学者必看!
- FPGA基于SFP光口实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持
- Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引
- 错误——由于ssh配置启动不了yarn
- 如何选择PLC?主要从这8个方面入手
- 为文本文档 设置 快捷键
- 用一个简单的例子说明如何使用S函数进行Simulink建模
- 汇编语言 DOSBOX的安装与masm的汇编
- 苹果“泰坦计划”迎来新掌舵人,软件定义汽车是大势所趋
- 【git】拉取修改别人pr与代理设置