网站建设的相关技术,做企业网站需要买什么,wordpress文章开始加内容,泰州 住房和城乡建设厅网站文章目录1、泛型编程和函数模板1、函数模板的实例化2、模板参数的匹配原则2、类模板1、泛型编程和函数模板
泛型编程顾名思义#xff0c;泛用性很高。之前C可以用重载来对付同名函数#xff0c;但还是麻烦#xff0c;有一个类型的变量就得写一个类型的函数。C对此创建了库这…
文章目录1、泛型编程和函数模板1、函数模板的实例化2、模板参数的匹配原则2、类模板1、泛型编程和函数模板
泛型编程顾名思义泛用性很高。之前C可以用重载来对付同名函数但还是麻烦有一个类型的变量就得写一个类型的函数。C对此创建了库这个概念比如要用到交换函数那么我们取库里的函数即可并且不需要考虑类型。常见的函数都已经包括在头文件里所以直接用就行。
templateclass S
void Swap(S x, S y)
{S tmp x;x y;y tmp;
}int main()
{int a 1, b 2;Swap(a, b);float c 1.1, d 2.2;Swap(c, d);return 0;
}这样就会很方便。但一个整形一个浮点型不能作为函数参数。
int和double类型两次调用的不是同一个函数。在汇编代码里两者调用的函数地址不一样栈帧也不一样。所以即使是同一个库里调用的也不一样。它们调用的不是模板调用的还是自己的模板里只是编译器帮你集成了所有类型的函数但代码量少不需要程序员操心。模板会根据代码实例化出对应的函数代码会把S换成相应的类型。模板相当于提供了蓝图编译器填充了内容然后程序员直接用即可。
1、函数模板的实例化
参数不同类型可以用强制类型转换来处理但是精度会丢失。另一个方法就是显式实例化。
int main()
{int a1 10, a2 20;double d1 1.1, d2 2.2;cout Addint(a1, d2) endl;cout Adddouble(a1, d2) endl;return 0;
}这里就是让编译器不再自己去推演类型而是根据代码找到对应的函数。
2、模板参数的匹配原则 一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这个非模板函数。 int Add(int left, int right)
{return left right;
}templateclass T
T Add(T left, T right)
{return left right;
}int main()
{int a 1;int b 2;Add(a, b);
}如果参数类型是非模板函数的参数类型那么就会调用非模板函数反之则调用模板函数这是自动的我们也可以指定调用模板函数。
Addint(a, b);这样就会调用模板函数了。编译器会选择更适配的那个函数如果实在没有合适的就会选择相对来讲更好的。 模板函数不允许自动类型转换但普通函数可以进行自动类型转换 2、类模板
templateclass T
class Stack
{
public:Stack(int capacity 4){_a new T[capacity];_top 0;_capacity capacity;}~Stack(){delete[] _a;_capacity _top 0;}
private:T* _a;size_t _top;size_t _capacity;
};int main()
{Stackint st1;Stackdouble st2;return 0;
}函数模板可以推演类型但是类模板必须要显式写出来。
类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类。Stack是类名加上后面的才是类型。
在类外面使用类的成员函数时之前是类::函数名有了模板后需要先声明一下模板再去调用函数。
templateclass T
StackT::Print();类模板不可以声明与定义分离。可以都放在类里也可以放入同一个文件里。
结束。