<二>类模板

类模板=>实例化=>模板类

通过类模板实现栈,点击查看代码
#include <iostream>
#include <cstring>
using namespace std;

template<typename T>
//template<typename T=int> 也可以这样写,写个默认类型
//这是个模板名称 ,模板名称+类型参数列表=类名称
class MyStack {

public:
        //在构造和析构函数名字后面可以不加<T>
	MyStack<T>(int _size = 10) :
		size(_size),
		top(-1),
		pHead(new T[size])
	{
	}

	//拷贝构造
	MyStack<T>(const MyStack<T> & src)
		: top(src.top),
		size(src.size)
	{
		pHead = new T[size];
		for (int i = 0; i<top; i++) {
			pHead[i] = src.pHead[i];
		}
	}

	MyStack<T> & operator=(const MyStack<T> & src) {
		if (this == &src) 
		{
			return *this; 
		}
		delete[] pHead;
		
		pHead = new T[size];
		for (int i = 0; i<src.top; i++) {
			pHead[i] = src.pHead[i];
			top++;
		}
		return *this;
	}

	//析构栈
	~MyStack() {
		delete[] pHead;
		pHead = nullptr;
	}

	//弹栈
	void pop() {
		if (Empty()) { return; }
		this->top--;
	}

	T getTop() const {
		if (Empty()) {
			 throw "Stack is Empty";			
		}
		else {
			return pHead[top-1];
		}
		
	}

	//压栈
	void push(const T & _val) {
		if (Full()) {
			Expend();
		}
		if (Empty()) { top = 0; }
		pHead[top++] = _val;
	}

	//是否是空的
	bool Empty()const {
		return top<0;
	}
	//是否是满的
	bool Full()const {
		return top == size-1;
	}

	void show() const {
		for (int i = 0; i < this->top; i++) {
			cout << pHead[i] << endl;
		}
	}
      
        void Test()const;

private:
	int size;//定义栈大小
	int top;//定义栈顶位置
	T   *pHead; //定义栈底指针

	//空间扩展
	void Expend() {
		int newSize = 2 * size;
		T *tepPHead = new T[newSize];
		for (int i = 0; i < top; i++) {
			tepPHead[i] = pHead[i];
		}
		this->size = newSize;
		delete[]this->pHead;
		this->pHead = tepPHead;

	}

};

template<typename T>
void MyStack<T>::Test()const {
	cout << "Test" << endl;
}


int main() {

        //类模板的选着性实例化
        //模板类 class MyStack<int>{};
	MyStack<int>  s1;

	s1.push(100);
	s1.push(50);
	s1.push(20);
	s1.push(200);

	s1.show();

	int topVal = s1.getTop();
	cout << topVal << endl;
	
	system("pause");
	return 1;
}

//类模板的选着性实例化 模板类 class MyStack{};
类模板是把类中的数据类型参数化
类模板的使用
类模板和函数模板的区别
类模板的默认参数
类模板的默认参数注意

类模板不会自动推导数据类型,要显示的告诉编译器是什么类型
默认的参数必须放在最后一个,换句话说,默认参数后面不能再出现非默认参数

posted @ 2022-11-16 16:13  Hello_Bugs  阅读(75)  评论(0编辑  收藏  举报