0
点赞
收藏
分享

微信扫一扫

【Spring篇】使用注解进行开发

泛型编程

如下的交换函数中,它们只有类型的不同,应该怎么实现一个通用的交换函数呢?

void Swap(int& left, int& right)
{
    int temp = left;
    left = right;
    right = temp;
}

void Swap(double& left, double& right)
{
    double temp = left;
    left = right;
    right = temp;
}

void Swap(char& left, char& right)
{
    char temp = left;
    left = right;
    right = temp;
}

那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢? 

模版分为:

函数模版:

函数模版概念:

函数模板格式:

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

函数模版原理:

函数模版实例化: 

隐式实例化: 让编译器根据实参推演模板参数的实际类型

 显式实例化:在函数名后的<>中指定模板参数的实际类型

模版参数的匹配原则:

 可以理解为:

类模版

类模版的定义格式:

 类模版实例化:

#include <iostream>
using namespace std;

template<class T>
class Stack
{
public:
	Stack(int n = 4);

	~Stack()
	{
		cout << "~Stack()" << endl;

		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}

	void Push(const T& x)
	{
		//...
	}

private:
	T* _a;
	int _top;
	int _capacity;
};

//类模版不能将定义和声明在不同的文件
//类外定义
template<class T>
Stack<T>::Stack(int n)
{
	cout << "Stack(int n = 4)" << endl;

	_a = new T[n];
	_top = 0;
	_capacity = n;
}

int main()
{
	//在普通的类中:类名就是类型
	//在类模版实例化的类中:类名不是类型,类名<数据类型>才是类型
	Stack<int> st1;//显示实例化
	Stack<double> st2;

	//显示实例化的类型不同,它们就是不同的类
	//st1 = st2;//一个是Stack<int>  一个是Stack<double>

	return 0;
}

以上就是个人学习的见解和学习过程的解析,欢迎各位大佬在评论区探讨,交流!
如果本篇对你有帮助的话,三连支持一下吧。
感谢大佬们的三连! 感谢大佬们的三连! 感谢大佬们的三连!

                                              

举报

相关推荐

0 条评论