類模板(上一篇沒講到類模板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;
}