电子商务网站建设与维护试卷答案,聊城集团网站建设,百度搜索流量查询,素材网站视频文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言
ADD函数很好写#xff0c;但是如果我们要有int类型的#xff0c;double类型的#xff0c;char类型的等等各种类型#xff0c;难道要写这么多不同的ADD函数吗#xff0c;这么写简直太麻… 文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言
ADD函数很好写但是如果我们要有int类型的double类型的char类型的等等各种类型难道要写这么多不同的ADD函数吗这么写简直太麻烦了所以有了泛型编程的概念。 一、泛型编程
实现一个通用的ADD函数有很多办法就比如函数重载但是函数重载又有很多的缺点比如
1.重载的函数仅仅是类型不同代码复用率比较低只要有新类型出现时就需要用户自己增加对应的函数。
2.代码的可维护性比较低一个出错可能所有的重载都出错。
那能否告诉编译器一个模子让编译器根据不同的类型利用该模子来生产代码呢
泛型编程编写与类型无关的通用代码是代码复用的一种手段。模板是泛型编程的基础。函数模板
函数模板的概念函数模板代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本。
函数模板格式
templatetypename p1,typename p2........
注意typename是用来定义模板参数关键字也可以使用class(切记不能使用struct代替class)template class T
void Swap(T d1, T d2)
{T tmp d1;d1 d2;d2 tmp;
}
int main()
{int a 10, b 50;Swap(a, b);double c 2.36, d 6.15;Swap(c, d);return 0;
} 那么上图中的两次调用Swap函数是同一个函数吗这里不是同一个函数我们先来验证一下 通过汇编代码我们发现两个函数并不是同一个他们有着不同的地址。这是因为模板就像是印刷的模具一样生成的函数就是印刷出来的书我们看的是书并不是印刷的板每本书用的印刷的板都是一样的但是书中的内容是不一样的。 函数模板是一个蓝图它本身并不是函数是编译器用使用方式产生特定具体类型函数的模具。所以其实模 板就是将本来应该我们做的重复的事情交给了编译器。 下面我们来看一些关于模板的小细节 templateclass T
T Add(const T left, const T right)
{return left right;
}
int main()
{int a1 10, a2 20;double d1 10.22, d2 20.32;cout Add(a1, a2) endl;cout Add(d1, d2) endl;return 0;
} 首先上面的代码是可以正常编译的那么如果写成下面这样呢 这里有两种解决方式一种是强制类型转换一种是显式实例化。 int main()
{int a1 10, a2 20;double d1 10.22, d2 20.32;//实参传递给形参自动推演模板类型cout Add(a1, (int)d1) endl;cout Add(d1, d2) endl;//显示实例化cout Addint(a1, d2) endl;cout Adddouble(a1, d1) endl;return 0;
} 在函数名后加需要的类型就可以完成显式实例化编译器直接以显式的类型去计算。 模板参数的匹配原则 // 专门处理int的加法函数
int Add(int left, int right)
{return left right;
}
// 通用加法函数
templateclass T
T Add(T left, T right)
{return left right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配编译器不需要特化Addint(1, 2); // 调用编译器特化的Add版本
}
int main()
{Test();return 0;
} 我们可以看到上面代码中有两个Add函数当他们类型都为int的时候为什么没有函数重定义呢 这是因为一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这个非模板函数。 那么像上图这样的情况编译器会调用哪个呢答案是第一个因为对于非模板函数和同名函数模板如果其他条件都相同在调用时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的一个函数那么将选择模板。 什么意思呢就是说已经存在一个能用的函数了编译器就不会花时间去实例化一个相同的函数而是调用那个已经存在的函数。 如果我们必须要调用那个模板有什么方法吗 我们直接在函数名后显示实例化就会调用模板了。 类模板 templateclass T
class Stack
{
public:Stack(int capacity 4){_a new T[capacity];_top 0;_capacity capacity;}~Stack(){delete[] _a;_a nullptr;_top _capacity 0;}
paivate:T* _a;size_t _top;size_t _capacity;
};
int main()
{Stackint sl;Stackdouble st;return 0;
} 类模板实例化与函数模板实例化不同类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类。 注意模板的声明和定义分开与普通类不一样如下图 模板的声明和定义分离只限于在一个文件中如果声明和定义在两个不同的文件会出现链接错误。 模板的类创建对象必须显示实例化在类名后面加确定其类型。 总结
模板的出现让我们在写一些代码相同但是类型不同的函数或者类的时候方便了很多以前这些都是由我们自己写出来的有了模板就可以由编译器去做这件事并且编译器做的比我们更好因为人写总是会出现一些粗心的错误编译器却不会。 文章转载自: http://www.morning.tgtrk.cn.gov.cn.tgtrk.cn http://www.morning.iqcge.com.gov.cn.iqcge.com http://www.morning.gtqws.cn.gov.cn.gtqws.cn http://www.morning.pqbkk.cn.gov.cn.pqbkk.cn http://www.morning.tpnch.cn.gov.cn.tpnch.cn http://www.morning.fgxws.cn.gov.cn.fgxws.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.ypzsk.cn.gov.cn.ypzsk.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.sdhmn.cn.gov.cn.sdhmn.cn http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.ptslx.cn.gov.cn.ptslx.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.gwdkg.cn.gov.cn.gwdkg.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.xsklp.cn.gov.cn.xsklp.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.fdfsh.cn.gov.cn.fdfsh.cn http://www.morning.hrypl.cn.gov.cn.hrypl.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn http://www.morning.ftmly.cn.gov.cn.ftmly.cn http://www.morning.rbbgh.cn.gov.cn.rbbgh.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.szoptic.com.gov.cn.szoptic.com http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.wjpsn.cn.gov.cn.wjpsn.cn http://www.morning.rgnp.cn.gov.cn.rgnp.cn http://www.morning.jcypk.cn.gov.cn.jcypk.cn http://www.morning.1000sh.com.gov.cn.1000sh.com http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn http://www.morning.nggbf.cn.gov.cn.nggbf.cn http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn http://www.morning.rkyw.cn.gov.cn.rkyw.cn http://www.morning.gfznl.cn.gov.cn.gfznl.cn http://www.morning.kklwz.cn.gov.cn.kklwz.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.dshkp.cn.gov.cn.dshkp.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.lthgy.cn.gov.cn.lthgy.cn http://www.morning.ndxmn.cn.gov.cn.ndxmn.cn http://www.morning.btqqh.cn.gov.cn.btqqh.cn http://www.morning.dpdns.cn.gov.cn.dpdns.cn http://www.morning.xctdn.cn.gov.cn.xctdn.cn http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.dljujia.com.gov.cn.dljujia.com http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.dodoking.cn.gov.cn.dodoking.cn http://www.morning.rswtz.cn.gov.cn.rswtz.cn http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.ltspm.cn.gov.cn.ltspm.cn http://www.morning.xgchm.cn.gov.cn.xgchm.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.nbqwr.cn.gov.cn.nbqwr.cn http://www.morning.kwdfn.cn.gov.cn.kwdfn.cn http://www.morning.wmyqw.com.gov.cn.wmyqw.com http://www.morning.ayftwl.cn.gov.cn.ayftwl.cn http://www.morning.gwtgt.cn.gov.cn.gwtgt.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn http://www.morning.lpskm.cn.gov.cn.lpskm.cn http://www.morning.mhnd.cn.gov.cn.mhnd.cn http://www.morning.nrydm.cn.gov.cn.nrydm.cn http://www.morning.zdtfr.cn.gov.cn.zdtfr.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.rykw.cn.gov.cn.rykw.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.gwsll.cn.gov.cn.gwsll.cn http://www.morning.trrrm.cn.gov.cn.trrrm.cn