1.模板是对具有相同特性的函数或类的再抽象,模板是一种参数化的多态性工具。所谓参数化多态性,是指将程序所处理的对象的类型参数化,使一段程序代码可以用于处理多种不同类型的对象。
2.模板分为:函数模板、类模板。模板通过参数实例化可以构建具体的函数或类,称为模板函数和模板类。而模板类参数实例化可以构建对象。
3.如果要对一个数求绝对值,当变量类型分别为int和double时,所写代码十分相似,只略微有所不同:
//对int类型求绝对值:
int abs(int a){
return a<0?-a:a;
}
//对double类型求绝对值:
double abs(double a){
return a<0?-a:a;
}
可以看出,对于同一个问题,各函数只是参数类型不一样,其功能在本质上完全相同。此时可以使用函数模板,使代码的可重用性大大提高。
函数模板是参数化的函数,定义格式如下:
template<模板形参表>
返回值类型 函数名(参数表){
函数体
}
此时对刚刚具有求绝对值功能的函数定义:
#include<iostream>
using namespace std;
template<typename T> //模板定义,一个或多个用逗号分开的模板形式参数。T为模板参数(用来进行类的传递),每一项均由关键字class或者typename(模板定义关键字)引导
T abs(T a){ //定义函数模板
return a<0?-a:a;
}
int main()
{
int x=-12;
double y=12.5;
cout<<abs(x)<<endl;
cout<<abs(y)<<endl;
return 0;
}
模板参数表示一种数据类型,可以是基本数据类型或者类类型。
数据类型在实际函数调用时被实例化,即用调用处的实际数据类型替代它。
4.如果要定义一个矩形类,对它的边长进行运算,则此时对于它的边长是整数还是实数的情况,会有不同的代码。使用类模板,效率会大大提高。
类模板的定义:
template<模板形参表>
class 类模板名
{
成员的声明;
}
用类的模板定义矩形类:
#include<iostream>
using namespace std;
template<typename T> //typename或class
class Rectangle //类模板定义
{
T x;
public:
Rectangle(T xx):x(xx){}
T fun(){return x*x;}
}; //加上分号!
类模板成员函数定义:
1).若放在类模板定义之中,则与类的成员函数定义方法相同
2).若放在类外定义,格式如下:
template<模板形参表> //模板形参表有引导词。注意每个函数都要写一遍,因为每个函数都是模板!
返回值类型 类模板名<形参名表>::成员函数名(参数表) //形参名表无引导词
{
成员函数体;
}
所以对于刚刚定义的Rectangle类,如果在类外定义成员函数,如:
template<class T>
T Rectangle<T>::circumference(){
return 2*length*width;
}
5.类模板实例化的格式如下:
类模板名<实际类型>
类模板类的对象的格式如下:
类模板名<实际类型> 对象名(实参表);
#include<iostream>
using namespace std;
template<typename T> //typename或class
class Rectangle{
T x;
public:
Rectangle(T xx):x(xx){}
T fun(){return x*x;}
};
int main(){
Rectangle<int> inta(15); //带参的构造函数
Rectangle<double> doublea(15);
cout<<inta.fun()<<endl;
cout<<doublea.fun()<<endl;
return 0;
}
本文深入解析C++模板的概念,包括函数模板和类模板的定义与使用。通过具体示例,如绝对值函数模板和矩形类模板,展示了模板如何提高代码的可重用性和效率。
335

被折叠的 条评论
为什么被折叠?



