前言
这次课程有一大半都在讲c++的ios类,听着真是让人头大,不过感觉没有什么特别大的难度。还是总结一下模板的使用方法吧,感觉模板这个东西确实能够节省很大的代码量。
模板的使用
函数模板
使用方法
template <class T1,class T2>//使用typename也可以
T Function(T1 a, T2 b)
{
//函数内容
}
传入什么类型的参数编译器会自动实例化出来一个相对应类型的函数。(神器的编译器)
不过我们也可以不通过传入参数的方法来使用函数。
Function<class T1,class T2>()
Function<double>(int a);
这个时候我们传入的参数会强制转化成相对应类型的参数。
值得一提的是函数也可以作为参数传入进去,这个时候T所代表的类为相对应类型的函数指针
int cmp(int a,int b)
{
return a < b;
}
Function(a,b,cmp);
这样将会很方便的调用不同的函数了。值得一提的是。一下两种用法的作用是一样的。
(*Function)(a, b, cmp)
Function(a, b, cmp);
Funciton会自动的转化为函数指针,然后去执行函数指针所指向的内存地址的代码。方便了使用
不过在这个地方我发现了一个奇怪的问题,待解决。
printf("%x\n", p);
cout<<p<<endl;
这两个不同的输出方式,如果按照上面的解释,将会直接输出p的地址,但是第二个的输出却是1。
cout 和 printf 的输出居然不一致,姑且认为是cout在重载函数指针的时候所进行的流程不一样吧…
类模板
使用方法
template <class T1,class T2>
class ClassName{
private:
\\成员
public:
\\成员
}
void ClassName<class T1,class T2>::Function(T1 a, T2 b) //当成成员函数在外部定义时
{
\\函数内容
}
相较于普通的类,在外部定义其实也就是加上了一个<参数类型列表>,本质上没有什么区别
ClassName <type a,type b> obj()
实例化一个相对应的类型方法也如上,其实和普通的也没有什么区别。
同时,类模板也可以派生与继承
template <class T1, class T2>
class A{
T1 v1;
T2 v2;
}
template <calss T3,class T4>
class B:public A<T3,T4>{
T3 v3;
T4 v4;
}
用法也和普通的是一样的,不过在继承的时候,如果继承的对象是一个类模板时,我们要先实例化父类(用子类的参数实例化)
友元的用法也差不多,便不再多讲
唯一有不同的便是static 成员的初始化方式不同
template<> type A<tyep a,type b>::v =0;
要加上一个template<>放在前面,虽然不知道为什么,但是照着做就行了。
不过按照老师的说法,其实在不同的编译器里面可加可不加,在dev c++里面必须甲,但是vs不要。