1.函数模板的性质
1) 函数模板并不是真正的函数,它只是C++编译生成具体函数的一个模子。
2) 函数模板本身并不生成函数,实际生成的函数是替换函数模板的那个函数,比如上例中的add(sum1,sum2),
这种替换是编译期就绑定的。
3) 函数模板不是只编译一份满足多重需要,而是为每一种替换它的函数编译一份。
4) 函数模板不可以设置默认模板实参。比如template <typename T=0>不可以。
template <typename 模版参数列表…>
1) 函数模板并不是真正的函数,它只是C++编译生成具体函数的一个模子。
2) 函数模板本身并不生成函数,实际生成的函数是替换函数模板的那个函数,比如上例中的add(sum1,sum2),
这种替换是编译期就绑定的。
3) 函数模板不是只编译一份满足多重需要,而是为每一种替换它的函数编译一份。
4) 函数模板不可以设置默认模板实参。比如template <typename T=0>不可以。
5) 函数模板不允许自动类型转换。
(6)模板的类型不固定,想是什么类型就可以是什么类型,具体是什么类型,执行的时候才知道。
(7)还要看执行的时候逻辑是否会出错,比如模板的功能是比大小,但传进去的参数确是类,所以就不可以。
C++模版函数的语法template <typename 模版参数列表…>
函数返回类型 函数名(形参列表…)
template <calss T1> //T1为 所创建模板的类型
T1 m(T1 X,T1 y)
{
return (x<y)?x:y; //只要能调用<运算的都可以用这个模板,具体到的数据类型在执行的时候才生效!
}
//在这里调用对象做参数就是错的,因为对象不可以进行<运算。
calss Stu{.........}
Stu stu1, Stu stu2
Stu stu=m(stu1,stu2);
//下面的就是对的!
int main()
{
int n1=2;
int n2=10;
int i=m(n1,n2); //在用模板的时候,n1和n2类型要相同,返回的类型也要相同,是int全都是int,是float全都是float
cout<<"i"<<i<<endl;
return 0;
}
类模板:在类中使用了模板类型
构造函数用模板的时候要这样写 MyClass<T1,T2>::MyClass(T1 a,T2 b)
具体例子如下:
#ifndef LEIBOBAN_H
#define LEIBOBAN_H
#include<iostream>
using namespace std;
template <typename T1,typename T2> //模板类的定义在声明文件中,其他文件重复引用该头文件时不会出错
class leiboban
{
public:
T1 I;
T2 J;
leiboban(T1 a,T2 b)
{
void show();
/*
void show2()
{
cout<<"I="<<this->I<<",j="<<this->J<<end;
}
*/
}
};
//构造函数
template<typename T1,typename T2> //每写一个用该模板类的函数时都要加上声明
MyClass<T1,T2>::MyClass(T1 a,T2 b){ //模板函数是这样定义的
this->I=a;
this->J=b;
}
//void show();
template<typename T1,typename T2>
void leiboban<T1,T2>::show()
{
cout<<"I="<<this->I<<",J="<<this->J<<endl;
}
#endif // LEIBOBAN_H