C++入门基础教程:模板(上)

Posted Zhi Zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门基础教程:模板(上)相关的知识,希望对你有一定的参考价值。

前言

博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读,今后的一段时间我将持续更新C++入门系列博文,想学习C++的朋友可以关注我,希望大家有所收获。

一、函数模板

1.1 基本概念

语法:template

template----声明创建模板

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

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

使用模板有两种方式:1)自动类型推导;2)显示指定类型。

// 函数模板
template<typename T>
void myswap(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}
// 利用函数模板实现交换
void test()
{
	int a = 1, b = 2;
	
	// 1.自动类型推导
	myswap(a, b);
    
    cout << "a= " << a << endl;
	cout << "b= " << b << endl;

	// 2.显示指定类型
	myswap<int>(a, b);

	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
}

1.2 函数模板注意事项

1)自动类型推导,必须推导出一致的数据类型T;

2)模板必须要确定出T的数据类型。显示指定类型:例如函数 myswap(a, b);

// 模板
template<class T>
void myswap(T &a, T &b)   // typename可以替换为class
{
	T temp = a;
	a = b;
	b = temp;
}

// 1、自动类型推导,必须推导出一致的数据类型T
void test01()
{
	int a = 1, b = 2;
	char c = 'c';
	// 1.自动类型推导
	//myswap(a, b);  // 正确!
	//myswap(a, c);  // 错误!推导不出一致的T类型

	// 2.显示指定类型
	//myswap<int>(a, b);

	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
}

// 2、模板必须要确定出T的数据类型
template<class T>
void func()
{
	cout << "func的调用" << endl;
}

void test02()
{
	func<int>();
}

1.3 普通函数与函数模板的区别

1)普通函数调用时可以发生自动类型转换(隐式类型转换);
2)函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换,但是利用显示指定类型的方式就可以。

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

template<class T>
T Add02(T a, T b)
{
	return a + b;
}

void test()
{
	int a = 10, b = 20;
	char c = 'c';
	
	// 调用普通函数
	cout << Add01(a, c) << endl;

	// 利用模板
	// 自动类型推导,不会发生隐式类型转换
	cout << Add02(a, c) << endl;  // 错误
	// 显示指定类型,可以发生隐式类型转换
	cout << Add02<int>(a, c) << endl;
}

1.4 普通函数与函数模板的调用规则

1)如果函数模板和普通函数都可以调用,优先调用普通函数;
2)可以通过空模板参数列表,强制调用函数模板;
3)函数模板可以发生重载;
4)如果函数模板可以产生更好的匹配,优先调用函数模板。

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

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

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

void test()
{
	int a = 10, b = 20;
	char c = 'c', d = 'd';
	// 1.如果函数模板和普通函数都可以调用,优先调用普通函数
	myPrint(a,b);
	// 2.可以通过空模板参数列表,强制调用函数模板
	myPrint<>(a, b);
	// 3.函数模板可以发生重载
	myPrint(a, b, 100);
	// 4.如果函数模板可以产生更好的匹配,优先调用函数模板
	myPrint(c, d);
}

结束语

大家的点赞和关注是博主最大的动力,博主所有博文中的代码文件都可分享给您(除了少量付费资源),如果您想要获取博文中的完整代码文件,可通过C币或积分下载,没有C币或积分的朋友可在关注、点赞和评论博文后,私信发送您的邮箱,我会在第一时间发送给您。博主后面会有更多的分享,敬请关注哦!

以上是关于C++入门基础教程:模板(上)的主要内容,如果未能解决你的问题,请参考以下文章

C++入门基础教程:类和对象(上)

精选C++类模板5分钟入门教程

C++函数模板5分钟入门教程

C++入门篇之模板基础讲解

C++入门篇之模板基础讲解

C++黑马程序员 | c++教程从0到1入门编程笔记 | c++提高编程