【C++】11___模板(1)

发布于:2024-12-18 ⋅ 阅读:(98) ⋅ 点赞:(0)

目录

一、模板的概念

 二、函数模板

 三、普通函数与函数模板

3.1区别

3.2调用规则


一、模板的概念

  • 模板不能直接使用,它只是一个框架
  • 模板的通用并不是万能的
  • 分为两类:函数模板、类模板

 二、函数模板

  • 函数模板语法:

        template<typename  T >

        函数声明或定义

  • 解释:

template ---  声明创建模板

typename  --- 表面其后面的的符号是一种数据类型,可以用class代替

T ---  通用的数据类型,名称可以替换,通常为大写字母

 代码示例

#include<iostream>
using namespace std;

template<typename T>
void Swap(T &a, T &b){
	T tmp = a;
	a = b;
	b = tmp;
}
void test(){
	int a = 10;
	int b = 20;
	//自动类型推导
	Swap(a,b);
	cout<<"a="<<a<<"  b="<<b<<endl;
	double c = 1.1;
	double d = 2.2;
	// 显示指定类型
	Swap<double>(c,d);
	cout<<"c="<<c<<"  d="<<d<<endl;
}
int main(){
	
	test();
	return 0;
}

排序案例---代码说明

#include<iostream>
using namespace std;

//交换模板
template<typename T>
void Swap(T &a,T &b){
	T tmp = a;
	a = b;
	b = tmp;
}

//排序模板
template<typename T>
void Sort(T &charArr,int &len){
	for(int i=0;i<len;i++){
		int max = i;
		for(int j=i+1;j<len;j++){
			if(charArr[max] < charArr[j]){
				max = j;
			}
		}
		if(max != i){
			Swap(charArr[max],charArr[i]);
		}
	}
}

// 打印数组模板
template<typename T>
void print(T &Arr,int &len){
	for(int i=0;i<len;i++){
		cout<<Arr[i]<<" ";
	}
	cout<<endl;
}

void test(){
	char Arr[] = "bdacfe";  // 字符排序
	int len = sizeof(Arr) / sizeof(char);
	Sort(Arr,len);
	print(Arr,len);
	
}

void test1(){
	int Arr1[] = {4,7,1,3,6,0,8,2,5,9};  // 数组排序
	int len = sizeof(Arr1) / sizeof(int);
	Sort(Arr1,len);
	print(Arr1,len);
}
int main(){
	
	test();
	test1();
	return 0;
}

 三、普通函数与函数模板

3.1区别
  • 普通函数调用时可以发生隐式类型转换
  • 函数模板调用时,自动类型推导(不会发生隐式类型转换)、显示指定类型(可以发生隐式类型转换)

 代码示例

#include<iostream>
using namespace std;

int Add(int a, int b){
	return a+b;
}

template<typename T>
int Add1(T a, T b){
	return a+b;
}

void test(){
	int a = 10;
	char c = 'c';
	cout<<Add(a,c)<<endl; // 109
//	cout<<Add1(a,c)<<endl;//错误
	cout<<Add1<int>(a,c);//109
	
}

int main(){
	test();
	return 0;
}
3.2调用规则
  1.  如果函数模板和普通函数都可以实现,优先调用普通函数
  2. 可以通过空模板参数列表来强制调用函数模板
  3. 函数模板也可以发生重载
  4. 如歌函数模板可以产生更好的匹配,有限调用函数模板

代码示例 

#include<iostream>
using namespace std;

void print(int a, int b){
	cout<<"普通函数的调用"<<endl;
}

template<typename T>
void print(T a, T b){
	cout<<"函数模板的调用"<<endl;
}

template<typename T>
void print(T a, T b,T c){
	cout<<"函数模板重载的调用"<<endl;
}

void test(){
	int a = 1;
	int b = 1;
	print(a,b);//普通函数的调用
	
	print<>(a,b);//函数模板的调用
	
	print(a,b,1);//函数模板重载的调用
	
	char c = 'a';
	char d = 'a';
	print(c,d);//函数模板的调用,因为调用普通函数时需要进行隐式转换
}

int main(){
	
	test();
	return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到