前言
当我们定义一个数据类型后,如果要修改其类型可以通过强制转换或者直接在源码的基础上修改其类型,这样做会不会不太“智能”,今天就让我们来学学新鲜东西吧--C++模板
一、函数模板
1.什么是函数模板
函数内部对象的数据类型在调用函数时才确定,函数模板就是将数据类型参数化,将类型动态化处理,可以通过我们传递的参数自动判断类型,基本模型如下:
template <typename T1> //typename和class是同等的,可以互换
void func(T1 a)
{
cout << "a = " << a << endl;
}
//切记:一个T1只能作用于它的下一个函数,如果紧接着定义下一个函数就是错的
void func2(T1 b) //error
{
}
2.函数模板实例
代码如下(示例):
#include <iostream>
using namespase std;
//template <class T1>
template <typename T1>
void func(T1 a)
{
cout << "a = " << a << endl;
cout << "sizeof() = " << sizeof(a) << endl;
}
int main(int argc,char *argv[])
{
int a = 10;
func(a);
char b = 'a';
func(b);
string str = "hello";
func(str);
return 0;
}
代码执行结果:
从代码和运行结果可以观察到,源代码中只写了一个类型T1,但是传递的参数为int、char、string,输出结果显示可以表明func函数的确可以自动识别参数类型,这就是函数模板的简单实例,这是不是突然之间就把程序变得稍微“智能”了一点!
二、类模板
1、什么是类模板
其实当你了解了上面所讲述的函数模板,你可能都猜到了类模板的大概框架结构了吧,看看类模板的大致框架吧
template <typename T1,typename T2>
class Person
{
public:
T1 _attri1;
T2 _attri2;
};
//T1和T2是两个类型,在同一次使用过程中确定就不能改变,除非重新传递类型
2、类模板调用
//该实例是将函数的实现和函数的声明分开实现
template <typename T1,typename T2=int> //可以使用默认参数
class A
{
public:
A();
};
template <typename T1,typename T2> //类外实现的成员函数,函数模板不能有默认参数
A<T1,T2>::A() //成员函数或者构造函数等在类外实现的格式要求就是这样写
{
初始化、构造
}
//调用,类模板实例化对象时没有自动推导类型的方式,只能通过<>显示指定类型
A<int,char> p1;
3、数组类模板实例
template.cpp
#include <iostream>
using namespace std;
#define SIZE 10
template <typename T1>
class Arr
{
public:
Arr();
Arr(T1 *arr,int size);
T1 RetArrInfo(int i);
T1 *_arr;
int _size;
};
template <typename T1>
Arr<T1>::Arr()
{
int _size = SIZE;
T1 *_arr = new T1[SIZE];
}
template <typename T1>
Arr<T1>::Arr(T1 *arr,int size)
{
_arr = arr;
_size = size;
}
template <typename T1>
T1 Arr<T1>::RetArrInfo(int i)
{
return _arr[i];
}
test.cpp
#include <iostream>
using namespase std;
#include "template.cpp"
int main(int argc,char *argv[])
{
int arr_int[10] = {1,2,3,4,5,6,7,8,9,0};
Arr<int> a1(arr_int,10);
cout << a1.RetArrInfo(2) << endl;
char arr_char[7] = {'a','g','r','e','q','i','t'};
Arr<char> a2(arr_char,7);
cout << a2.RetArrInfo(4) << endl;
string arr_string[5] = {"hello","world","nihao","shijie","!!!"};
Arr<string> a3(arr_string,5);
cout << a3.RetArrInfo(2) << endl;
return 0;
}
以上就是类模板实例,可以自己去实验以下,感受其中的含义
总结
今天的分享就到此结束了,以上分享都是非常非常基础的C++模板,有很多细节化的东西都没有讲到,这只能算是一点C++模板的启蒙,如果需要更加详细的教学可以前往其他大佬那里淘点知识