C++——模板

一、泛型编程

泛型编程就是写一个模板(与具体类型无关的通用代码),支持不同的类型使用。分为函数模板和类模板。

二、函数模板

(1)概念

函数模板不是函数,而是泛型编程。编译器会根据你传的参数自动根据这个模板完成这个函数。

(2)函数模板语法

cpp 复制代码
template <typename/class T>// 模板参数列表
返回值 函数名(参数列表)
{
    //函数体
}

tmplate仅限当前模板使用。

cpp 复制代码
template<class T>
void Swap(T& a,T& b) {
	T tmp = a;
	a = b;
	b = tmp;
}

T Add(T a,T b) {//报错,缺少template
	return a + b;
}

(3)函数模板实例化

编译器根据你传的参数,自动生成一个函数。分为显示实例化和隐式实例化。

①隐式实例化

编译器根据你传的参数推演出实际类型,完成函数的生成。

cpp 复制代码
template<typename T>
T Add(T a,T b) {
	return a + b;
}

int main() {
	int a1 = 2, a2 = 3;
	cout << Add(a1,a2) << endl;
	double a3 = 2.2, a4 = 3.3;
	cout << Add(a3, a4) << endl;
}

int Add(int a, int b) {//函数隐式实例化(编译器自动生成)
	return a + b;
}
②显示示例化

你指定类型,编译器不需要经过推断,按照你的指定完成函数的生成。

语法:

cpp 复制代码
模板函数名<指定类型>(参数列表);
cpp 复制代码
template<typename T>
T Add(T a,T b) {
	return a + b;
}

int main() {
	int a = 1, b = 2;
	cout << Add<int>(a,b) << endl;//显示实例化
}

(4)函数模板参数的匹配原则

①非模板函数可以和同名的模板函数同时存在;调用时优先调用非模板函数。

cpp 复制代码
template<typename T>
T Sub(T a,T b) {
	return a - b;
}
int Sub(int a, int b) {//非模板函数和模板函数可以同时存在
	return a - b;
}

int main() {
	int a = 1, b = 2;
	cout << Sub(a, b) << endl;//调用非模板函数
	cout << Sub<int>(a, b) << endl;//调用模板函数
}

②非模板函数不允许自动类型转化;普通函数允许自动类型转化。

cpp 复制代码
template<typename T>
T Sub(T a, T b) {
	return a - b;
}
int main() {
	int a = 3;
	double b = 2.1;
	Sub(a, b);//编译错误,模板函数不会进行隐式类型转化
}

int Sub(int a, int b) {
	return a - b;
}
int main() {
	int a = 3;
	double b = 2.1;
	Sub(a, b);//正常运行,普通函数会进行隐式类型转化
}

三、类模板

类模板不是真是的类,只是一个模板。创建对象时(实例化时才是真正的类),编译器会根据参数的类型自动完成类的生成。所以,类可以进行不同的实例化,且可以同时存在。

cpp 复制代码
template<class T>
class Calc {//模板类
public:
	Calc(T a, T b) :_vala(a),_valb(b){}
	T Add() {
		return _vala + _valb;
	}
	T Sub() {
		return _vala - _valb;
	}
private:
	T _vala;
	T _valb;
};
int main() {
	Calc <int>calc1(2, 3);//类模板不会推导参数的类型,必须手动写上<int>(类的实例化)
	int val1 = calc1.Add();
	cout << val1 << endl;
	int val2 = calc1.Sub();
	cout << val2 << endl;
}

四、STL

C++标准库:C++标准委员会制定的各种C++工具规则;编译器厂商根据规则实现这些工具。C++标准库就是一个给程序员使用的现成工具箱。
STL:C++标准库的重要组成部分。里面包含各种数据结构与算法。


相关推荐
汉克老师4 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9925 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven5 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981035 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus16 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla17 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu1 天前
一个通用游戏数据服务器
c++·架构
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论