C++模版(个人学习笔记)

89 阅读3分钟

1. 模版用途

例如某些程序实体,它们的实现和所完成的功能基本相同,不同的仅 仅是所涉及的数据类型不同。而模板正是一种专门处理不同数据类型的机制。

模板是泛型程序设计的基础。函数、类以及类继承为程序的代码复用提供了基本手段,还有一种代码复用途径——类属类型(泛型)

模板——是一段带有类型参数的程序代码,可以通过给这些参数提供一些类型来得到针 对不同类型的具体代码。

模板是C++中支持泛型编程的重要方法,是实现代码复用的工具,是实现参数化多态(类 型参数化)的手段,减轻了编程及维护的工作量和难度。

一个模板并非一个实实在在的类或函数,仅仅是一个类或函数的描述。模板是规则,通 过模板可以演化出多个具体的类或函数。

在C++中,能带有类型参数的代码可以是函数和类,所以模板一般分为函数模板和类模板。

2. 函数模板

定义格式

image.png

1,template是声明模板的关键字,告诉编译器开始泛型编程。

2,尖括号<>中的typename是定义形参的关键字,用来说明其后的形参名为类型 参数,(模板形参)。Typename(建议用)可以用class关键字代替,两者没有区别。

3,模板形参(类属参数)不能为空(俗成约定用一个大写英文字母表示),且在函 数定义部分的参数列表中至少出现一次。与函数形参类似,可以用在函数定义的各 个位置:返回值、形参列表和函数体。

4,函数定义部分:与普通函数定义方式相同,只是参数列表中的数据类型要使用 尖括,号<>中的模板形参名来说明。当然也可以使用一般的类型参数。

#include <iostream>
using namespace std;
template<typename T>//模板头,template关键字告诉编译器开始泛型编程
T add(T t1, T t2)//类型参数化为T
{
	return t1 + t2;
}
int main()
{
	cout << add(12, 34) << endl;
	cout << add(12.2,45.6) << endl;
	return 0;
}

注意

定义好的函数模板不可以直接使用,只相当于一个模具、规则,可使用不同类型的 参数来调用,可减少代码的书写,提高代码复用性。但使用函数模板不会减少最终 可执行程序的大小,因为在调用函数模板时,编译器会根据调用时的参数类型进行 相应的实例化。

不能直接使用函数模板实现具体操作,必须对模板进行实例化,即将模板参数实例 化,就是用具体的类型参数去替换函数模板中的模板参数,生成一个确定的具体类 型的真正函数,才能实现运算操作。

函数模板实例化的方法有两种:

隐式实例化:根据具体的函数调用形式,推演出模板参数类型。

显式实例化:通过显式声明形式指定模板参数类型

#include <iostream>
using namespace std;
template<typename T>
T add(T t1, T t2)
{
		return t1 + t2;
}
template int add<int>(int t1, int t2);//显示实例化为int类型
int main()
{
		cout << add<int>(12, 'A') << endl;//函数模板调用:A-65
		cout << add(1.4, 5.7) << endl;//隐式实例化:自动实参推演
		cout << add<int>(23.4, 44.2) << endl;//显示声明可省,结果为67
		return 0;
}

3. 类模板

类模板是对成员数据类型不同的类的抽象,它 说明了类的定义规则,一个类模板可以生成多种具体的类。与函数模板的定义形式类似, 类模板也是使用template关键字和尖括号“<>”中的模板形参进行说明,类的定义形 式与普通类相同。

类模板并不能直接使用,需要对其进行实例化,实例化的方法是:类名<具体类型> 对 象名。通过类模板实例化得到的对象的操作办法,与普通类对象的操作办法相同。

定义格式

image.png

类模板中的类型参数可用在类声明和类实现中。类模板的模板形参(类型参 数)不能为空,一旦声明了类模板就可以用类模板的形参名声明类中的成员变量和 成员函数,即在类中使用内置数据类型的地方都可以使用模板形参名来代替。

template<typename T>   //这里不能有分号。一个模板形参
class A
{
public:
        T a;   //成员变量
        T b;   //成员变量
        T func(T a, T b);  //成员函数声明
};

类与类模板的关系

由于类模板包含类型参数,因此也称为参数化类,如果说类是对象的抽象,对象是 类的实例,则类模板是类的抽象,类是类模板的实例。

类模板的实例化

定义了类模板后就要使用类模板创建对象以及实现类中的成员函数,这个过程其实 也是类模板实例化的过程,实例化出的具体类称为模板类。

template<typename T1, typename T2>
class B
{
public:
        T1 a;
        T2 b;
        T1 func(T1 a, T2& b);
};
B <int, string>  b;    //创建模板类B的一个对象
————————————————
Point<float, float> *p1 = new Point<float, float>(10.6, 109.3);

Point<char*, char*> *p = new Point<char*, char*>("东京180度", "北纬210度");

基本概念结束。

更加详情:

blog.csdn.net/qq_52905520… blog.csdn.net/JAN6055/art…