类模板(上一篇没讲到类模板C/C++内存管理&函数模板-CSDN博客)
类模板的定义:
template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};
用一个简单的栈例子讲类模板
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <assert.h>
#include <stdlib.h>
using namespace std;template<class T>
class vector
{
private:T* _a;size_t _size;size_t _capacity;
public:vector() // 默认构造函数:_a(nullptr),_size(0),_capacity(0){}~vector() // 析构函数{delete[] _a;_a = nullptr;_size = _capacity = 0;}size_t size() // 获得栈的元素个数{return _size;}// v[i]==>v.operator[](&v,i)// 返回值传引用,外面才能对这个值进行修改T& operator[](size_t i) // []运算符重载 ==>T& operator[](vector* this,size_t i){assert(i < _size);return _a[i]; // ==>return this-> _a[i];}// 类里面声明void push_back(const T& x); // 传引用减少调用拷贝构造函数void pop_back();
};
// 类外面定义
template<class T> // 不能少,在类外面定义函数都必须写
void vector<T>::push_back(const T& x)
{// 内存不够,增容if (_size == _capacity){size_t new_capacity = _capacity == 0 ? 2 : _capacity * 2; // 2倍数扩容T* temp = new T[new_capacity];if (_a){memcpy(temp, _a, sizeof(T) * _size); // 将就空间的全部值拷贝到tempdelete[] _a;}_a = temp;_capacity = new_capacity;}_a[_size] = x; // 压栈++_size;
}
template<class T>
void vector<T>::pop_back()
{assert(_size > 0);--_size;
}int main()
{// 类对象实例化vector<int> v;// v的类型是:vector<int>v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (int i=0;i < v.size();i++){v[i] *= 2; // 修改栈的元素 v[i]==>v.operator[](&v,i)}for (int i=0;i < v.size();i++){cout << v[i] << " ";}cout << endl;return 0;
}