c++关于模板的复习整理

c++关于模板的复习整理

  • 一、函数模板
  • 二、类模板

一、函数模板

函数模板是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来推导真正的类型。这个通用函数就称为函数模板。

确定一个函数模板,可以为编程节约时间,当传入参数时,自动推导,不用再根据情况随时改变参数或者返回值的类型,而是由系统推导。

template 这个是一个模板头,固定写法,下面紧跟一个类(类模板)或者函数(函数模板)template是定义函数模板的关键字,后面紧跟尖括号<>,尖括号包围的是类型参数。typename也是一个关键字,用来声明具体的类型参数T,这里的T也可以用其他的符号表示,类型参数的命名规则跟其他标识符的命名规则一样,不过一般习惯于用T、T1等参数名。

template<typename T>
T fun(T a, T b)
{
 return a + b;
}
int main()
{
 int a = 10;
 int b = 20;
 cout << fun(a, b) << endl;
 int c = 'c';
 int d = 10;
 cout<<fun(c, d)<<endl;
 system("pause");
 return 0;
}

输出为:
30
109
由结果可以看出,模板自动推导出所需要的参数类型。

函数模板与普通函数的区别,以及调用原则
1、函数模板和普通函数可以重载。
2、如果出现重载,优先调用普通函数,如果普通函数没有实现,报错
3、想要强制调用模板,那么可以使用显示指定类型调用
4、如果函数模板可以产生更好的匹配,那么优先调用函数模板

template<typename T>
T fun(T a, T b)
{
 cout << "模板" << endl;
 return a + b;
}
int fun(int a, int b)
{
 cout << "普通" << endl;
 return a + b;
}
int main()
{
 int a = 10;
 int b = 20;
 cout << fun(a, b) << endl;
 int c = 'c';
 int d = 10;
 cout<<fun(c, d)<<endl;
 cout << fun<int>(c, d)<<endl;
 system("pause");
 return 0;
}

输出为:
普通
30
普通
109
模板
109
由此可见,当模板函数和普通函数重载,会优先调用普通函数。
若要调用模板函数,可以指定函数类型来调用,如:fun(c, d),此时调用的是模板函数。

函数模板也可以提前声明,不过声明时需要带上模板头,并且模板头和函数定义(声明)是一个不可分割的整体,它们可以换行,但中间不能有分号。

二、类模板

#include
#include
using namespace std;
//类模板.参数
template<typename T1, typename T2>
class Person
{
 T1 m_name;
 T2 m_age;
public:
 Person(T1 name, T2 age);
 void showPerson();
};
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name, T2 age)
{
 this->m_name = name;
 this->m_age = age;
}
template<typename T1, typename T2>
void Person<T1, T2>::showPerson()
{
 cout << m_name << endl << m_age << endl;
}
int main()
{
 Person<string, int> p("xiaowang", 18);
 p.showPerson();
 system("pause");
 return 0;
}

输出为:
xaiowang
18
由结果可见,操作正确。同时也可以看出,在构建类模板的时候,所要遵循的规范。‘
定义类模板时的格式:

template<typename 类型参数1 , typename 类型参数2 ,>
class 类名
{
  //。。。
};

在函数类内声明,类外实现的时候:

template<typename 类型参数1 , typename 类型参数2 ,>

返回值类型 类名<类型参数1 , 类型参数2, ...>::函数名(形参列表){

    //,,,:

}

通过类模板来创建对象的时候,需要指明具体的数据类型。比如 Person p("xiaowang", 18);
就在创建对象之前,定义了所要传入模板的参数类型。

你可能感兴趣的:(c++学习笔记,c++)