模板编程
以前总是以各种理由想逃避写博客,总觉得写博客很浪费时间,最近才发现,学到现在,也是有一定的基础,接触的新东西越来越多,学的东西越来越快,然而,学得快忘得也快,故此,现在写些博客记录学习的过程,我相信,现在应该不玩。下面进入正题。
模板是C++语言中重要的概念,它提供了一种通用的方法来开发可重用的代码,即可以创建参数化的C++类型,模板分为两种类型:函数模板和类模板。在STL中,模板到处可见,关于模板的基础内容,我不想记录(网上资料到处都是),实例才是学习编程的最好方法。
下面动态数组模板类源码:
MyArray.h
#pragma once template<typename T> class MyArray { private: int m_nTotalSize;//数组总长度 int m_nValidSize;//数组有效长度 T* data;//数据 public: MyArray(int size=3); ~MyArray(); void Add(T value); int getSize(); T get(int index); T operator[](int); };
MyArray.cpp
#include"MyArray.h" template<typename T> MyArray<T>::MyArray(int size=3)//数组默认总长度为3 { data = new T[size]{ 0 }; m_nTotalSize = size; m_nValidSize = 0; } template<typename T> MyArray<T>::~MyArray() { if (data != nullptr) { delete[] data; data = nullptr; } } template<typename T> void MyArray<T>::Add(T value)//向数组中出入数据 { if (m_nValidSize < m_nTotalSize)//有效长度小于总长度 { data[m_nValidSize] = value; m_nValidSize++; } else//有效长度大于等于总长度时 { T * tmp = new T[m_nTotalSize];//原始数据备份 for (int i = 0; i < m_nTotalSize; i++) { tmp[i] = data[i]; } delete[] data; m_nTotalSize *= 2; data = new T[m_nTotalSize];//重新分配空间 for (int i = 0; i < m_nValidSize; i++)//回写备份数据 { data[i] = tmp[i]; } delete[]tmp; data[m_nValidSize] = value; m_nValidSize++; } } template<typename T> int MyArray<T>::getSize() { return m_nValidSize; } template<typename T> T MyArray<T>::get(int index) { if (index < m_nTotalSize) return data[index]; return (T)0; } template<typename T> T MyArray<T>::operator[](int index) { return get(index); }
测试代码
#include".\MyArray.cpp"//不能用MyArry.h,因为二次编译导致链接问题 #include<iostream> int main() { MyArray<int> obj; for (int i = 1; i < 5; i++) { obj.Add(i); std::cout << obj[i-1] << " "; } std::cout << std::endl; std::cout << obj.getSize() << std::endl; return 0; }
太过安逸的日子给人未必是幸福,它很有可能毁了一个人的理想,腐蚀一个人的心灵