京东联盟推广网站,做金融培训的网站,高端网站建站 北京,wordpress图片拖拽到富文本里面模版-----是为了让代码更加通用#xff0c;使代码不受数据类型的影响。减少代码冗余。模版将数据类型当作一个参数进行传递。包括函数模版和类模板。 函数模版#xff1a; //定义一个比较大小的函数模版
templatetypename Type // 也可以写成 template class Ty…模版-----是为了让代码更加通用使代码不受数据类型的影响。减少代码冗余。模版将数据类型当作一个参数进行传递。包括函数模版和类模板。 函数模版 //定义一个比较大小的函数模版
templatetypename Type // 也可以写成 template class Type
Type Max(Type a,Type b)
{return a b ? a : b;
}
int main()
{cout Max(1,2) endl;cout Max(A, a) endl;cout Max(2.5,3.2) endl;return 0;
} 模版会根据传递的实参自动进行数据类型的推演比如在Max(2.5,2.3)中模版会根据2.5是double2.3是double模版会推导出Type是double类型生成一个模版函数使用double类型的比较函数。所以模版虽然方便但是效率不高。 比如调用函数Max(1,2)时编译器会先根据函数模版生成一个int类型的模版函数然后在调用这个函数。 //模版函数int Max(int a, int b)
{return a b ? a : b
} 当出现实参类型不一致时普通函数正常运行模版会出现错误如 /*templatetypename Type //会产生二义性
Type Max(Type a,Type b)
{return a b ? a : b;
}*/
int Max(int a,int b) //会自动进行隐式转换
{return a b ? a : b;
}
int main()
{cout Max(1,2.3) endl; cout Max(1,(int)2.3) endl; //将2.3强制转换成int类型 cout Maxint(1,2.3) endl; //指定调用int类型的模版函数
} 也可以重新编写模版函数如 templatetypename Type1, typename Type2
Type2 Max(Type1 a,Type2 b)
{return a b ? a : b;
} 如果是类对象进行比较需要重载比较运算符。模版只负责比较不管如何进行比较。 class Test
{int num;
public:Test(int b):num(b){}bool operator(const Test t){if (this-num t.num)return true;else return false;}
};
templatetypename Type1
Type1 Max(Type1 a,Type1 b)
{return a b ? a : b;
}
int main()
{Test t1(10);Test t2(9);Max(t1,t2); //不能使用cout输出因为没有提供运算符函数
} 类模板 利用类模板简单实现线性链表。 int a int(); //将a初始化为0 模版类成员函数都是模版函数不允许将类定义和实现分离 #include iostream
using namespace std;
//声明List类
templatetypename Type
class List;
templatetypename Type
class ListNode
{
private:Type data;ListNodeType *next;
public:friend class ListType; //将List类成为ListNode类的友元类才能访问私有数据ListNode():data(Type()),next(NULL){} //零初始化根据不同类型进行初始化。如int a int() //a被初始化为0。ListNode(Type d,ListNodeType *n NULL):data(d),next(n){}~ListNode(){}
};templatetypename Type
class List
{
private:ListNodeType *first;ListNodeType *last;size_t size;
public:List();~List();bool push_back(Type x); //尾部插入链表 //显示列表函数void Show_list() const //模版类的成员函数可以在类内部定义{ListNodeType *pfirst;while(p ! NULL){cout p-data;p p-next;}}
};
templatetypename Type //模版类的成员函数都是模版函数所以必须写templatetypename Type
ListType::List() //限定是ListType::
{first last new ListNodeType;last-next NULL;size0;
}
templatetypename Type
ListType::~List()
{ListNodeType *pfirst;while(p ! NULL){first p-next;delete p; //在构造函数中使用new则在析构函数中使用deletesize--;pfirst;}
}
templatetypename Type
bool ListType::push_back(Type x)
{ListNodeType *s new ListNodeType;if( s NULL )return false;s-data x;s-next NULL;last-next s;last s;return true;
}
int main()
{Listint mylist;for(int i1;i10;i){mylist.push_back(i);}mylist.Show_list();return 0;
} 转载于:https://www.cnblogs.com/zhangzeze/p/8717968.html