模板类的简单应用

文章介绍了C++中的模板类和函数模板的概念与应用。通过示例展示了如何使用模板实现类型无关的函数,如交换函数test_swap,以及如何通过模板创建泛型类如person。同时,解释了模板类与普通函数的调用规则和区别,并提供了模板在冒泡排序问题上的应用,强调了模板在处理不同类型数据时的灵活性。
摘要由CSDN通过智能技术生成

**

模板类的简单应用

**
一、函数模板
(1)模板类的最大应用便是可以类型参数化,编写代码可以忽略类型。
例如下面交换两数的例子,普通交换函数在数值类型不同时需要编写两个不同的函数:
整数型:

void test_swap(int &a,int &b){
	int temp = a;
	 a = b;
	 b = temp;
}

浮点数型:

void test_swap(double &a,double &b){
	double temp = a;
	a = b;
	b = temp;
}

而模板可以忽略类型,模板定义:

template<class T>//T在这里指代类型
void test_swap(T &a,T &b){ //模板类交换函数
	T temp = a;
	a = b;
	b = temp;
}
void print_swap(){ //模板:自动类推导
	int a = 10;
	int b = 20;
	cout << a << b << endl;
	test_swap(a, b);
	cout << a << b << endl;
	int c = 3.14;
	int d = 6.28;
	cout << c << d << endl;
	test_swap(c, d);
	cout << c << d << endl;
}

(2)模板类与普通函数同名被调用时:c++优先考虑普通函数,如果想调用模板函数,只需在调用时加<>:

test_swap<>(a,b);

而在调用函数时,当模板函数比普通函数能得到更好的匹配时,也会优先调用模板函数。

(3)模板类与普通函数的区别:模板类不可以进行自动类转换,但是普通函数可以,例如:

void test_add(int a, char c) {
	int b = a + c;
	cout << b << endl;
}

能看到答案是:很明显是将c转换为十进制ASCII码进行相加
在这里插入图片描述

在这里插入图片描述
另外,函数模板在编写成功后计算机内部其实不是直接调用模板的,需要根据你的输入先生成一个模板函数,再完成调用。
在这里插入图片描述

二、类模板
类模板与函数模板类似,这里举一个简单示例:

template<class T>
class person {
public:
	person(T id, T name) { //有参构造函数
		this->pid = id;
		this->pname = name;
	}
	void show() {
		cout << "id:" << pid << "name:" << pname << endl;
	}
public:
	T pid;
	T pname;
};

void test() {
	person<int> p(10,20); //先指定模板类型,在进行赋值
	p.show();
}

结果:
在这里插入图片描述
这里在对冒泡排序进行编写,正常的冒泡排序应该是这样(方法不唯一):

void print_arr(int *arr,int len) {
	for (int i = 0; i < len; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
}
void maopao() {
	int arr[] = { 1,6,3,9,7,8,2 };
	int len = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, len);
	for (int i = 0; i < len ; i++) {
		for (int j = i + 1; j < len; j++) {
			if (arr[i] >  arr[j]){
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
		     }	
		}		
	}
	print_arr(arr, len);
}

但是当遇见其他字符类型的时候,这个排序很难适应。例如:

	char charr[] = { 'a','e','f','c','b' };
	int len = sizeof(charr) / sizeof(charr[0]);

所以这时候就需要模板:

template<class T>
void print_maopao(T *arr,int len) { //打印模板
	for (int i = 0; i < len; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
}
template<class T>
void maopao1(T *arr,int len) {
	for (int i = 0; i < len; i++) {
		for (int j = i + 1; j < len; j++) {
			if (arr[i] > arr[j]) {
				T temp = arr[i]; 
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
	print_maopao(arr, len);
}

结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值