当前位置: 首页 > news >正文

购物网站两化融合建设项目报告游戏是怎么做的视频网站

购物网站两化融合建设项目报告,游戏是怎么做的视频网站,网页设计尺寸规范及标准详解,seo管理与优化期末试题函数模板的定义 所谓函数模板#xff0c;实际就是写一个通用函数#xff0c;返回值和参数的类型都是可变的#xff0c;用一个特定格式的变量来指定#xff0c;然后调用此函数的时候#xff0c;编译器会根据参数的数据类型自动推导出类型#xff0c;从而达到函数再不同的…函数模板的定义 所谓函数模板实际就是写一个通用函数返回值和参数的类型都是可变的用一个特定格式的变量来指定然后调用此函数的时候编译器会根据参数的数据类型自动推导出类型从而达到函数再不同的类型参数下可复用的目的。这个通用函数就是函数模板使用模板就无须关心数据类型只定义一个函数模板就可以。 定义函数模板的语法格式如下所示 templatetypename 类型占位符 返回值类型 函数名(参数列表) {//函数体; }其中template 是声明模板的关键字中的参数称为模板参数typename 关键字用于标识模板参数可以用class关键字代替class 和 typename 并没有区别。模板参数不能为空一个函数模板中可以有多个模板参数模板参数和普通函数参数相似。template下面是定义的函数模板函数模板定义方式与普通函数定义方式相同只是参数列表中的数据类型要使用中的参数名表示。 函数模板实例化 函数模板并不是一个函数它相当于一个模子定义一次即可使用不同类型的参数来调用该函数模板这样做可以减少代码的书写提高代码的复用性和效率。函数模板不会减少可执行程序的大小因为编译器会根据调用时的参数类型进行相应的实例化。所谓实例化就是用类型参数替换模板中的模板参数生成具体类型的函数。实例化可分为隐式实例化与显式实例化。 Example01 #include iostream// 定义函数模板 template typename T T my_add(T t1, T t2) {return t1 t2; }int main(int argc, char** argv) {std::cout my_add(1, 2) std::endl; // 传入int类型参数std::cout my_add(1.0, 2.0) std::endl; // 传入double类型参数return 0; }隐式实例化 隐式实例化是根据函数调用时传入的参数的数据类型确定模板参数 T 的类型模板参数的类型是隐式确定的. 在Example01中第一次调用my_add()函数模板时传入的是int类型的数据1、2编译器根据传入的实参推演出模板参数类型是int就会根据函数模板实例化出一个int类型的函数如下所示 int my_add(int t1, int t2) {return t1 t2; }编译器生成具体类型函数的这一过程就称为实例化生成的函数称为模板函数。生成int类型的函数后再传入实参1和2进行运算。 同理当传入 double 类型的数据时编译器先根据模板实例化出如下形式的函数 double my_add(double t1, double t2) {return t1 t2; }这样每一次调用时都会根据不同的类型实例化出不同类型的函数最终的可执行程序的大小并不会减少只是提高了代码的复用性。 显示实例化 隐式实例化不能为同一个模板参数指定两种不同的类型这就需要显式实例化解决类型不一致的问题。显式实例化需要指定函数模板中的数据类型语法格式如下所示 template函数返回值类型 函数名实例化的类型(参数列表);在Example01中,显示实例化为 int 类型则在调用时不是 int 类型的数据会转换为int类型再进行计算. #include iostream// 定义函数模板 template typename T T my_add(T t1, T t2) {return t1 t2; }template int my_addint(int t1, int t2); // 显示实例化为int类型int main(int argc, char** argv) {// 函数模板调用// 在调用int类型函数模板时传入一个字符a,则编译器会将字符类型a转换为ASCII码值然后在与1相加得出结果std::cout my_addint(1, a) std::endl; std::cout my_add(1.0, 2.0) std::endl;return 0; }需要注意的是对于给定的函数模板显式实例化声明在一个文件中只能出现一次并且在这个文件中必须给出函数模板的定义。 显示具体化 函数模板的显式具体化是对函数模板的重新定义具体格式如下所示 template 函数返回值类型 函数名实例化类型(参数列表) {//body }Example02 定义交换两个数据的函数模板示例代码如下: templatetypename T void my_swap(T t1, T t2) {T temp t1;t1 t2;t2 temp; }但现在有如下结构体定义示例代码如下 struct Student {uint64_t id;float score;char name[40]; };现在想交换2个学生的id但是又不想交换姓名、成绩等其他信息则可以用显示具体化方式重新定义函数模板只需交换结构体的部分成员变量即可。则该显示具体化如下所示 template void my_swapStudent(Student t1, Student t2) {int temp t1.id;t1.id t2.id;t2.id temp; }如果函数有多个原型则编译器在选择函数调用时非模板函数优先于模板函数显式具体化模板优先于函数模板.例如下面三种定义 void my_swap(int, int); //直接定义 templatetypename Tvoid my_swap(T t1, T t2); //模板定义 template void my_swapint(int, int); //显式具体化对于int a,int b,在调用my_swap(a, b)时则**优先调用直接定义的函数如果没有则优先调用显示具体化如果2者都没有才会调用函数模板。 函数模板重载 函数模板可以进行实例化以支持不同类型的参数不同类型的参数调用会产生一系列重载函数。 在Example01中两次调用my_add() 函数模板编译器会根据传入参数不同实例化出两个函数如下所示 int my_add(int t1, int t2) // int 类型参数实例化出的函数 {return t1 t2; }double my_add(double t1, double t2)// double 类型参数实例化出的函数 {return t1 t2; }函数模板本身也可以被重载即名称相同的函数模板可以具有不同的函数模板定义当进行函数调用时编译器根据实参的类型与个数决定调用哪个函数模板实例化函数。 #include iostream int my_max(const int a, const int b) // 非模板函数求两个int类型数据的较大值 {return a b ? a : b; }template typename T // 定义求两个任意类型数据的较大值 T my_max(const T t1, const T t2) {return t1 t2 ? t1 : t2; }template typename T // 定义求三个任意类型数据的最大值 T my_max(const T t1, const T t2, const T t3) {return my_max(my_max(t1, t2), t3); }int main(int argc, char** argv) {std::cout my_max(1, 2) std::endl; // 调用非模板函数std::cout my_max(1, 2, 3) std::endl; // 调用三个参数的函数模板std::cout my_max(a, e) std::endl; // 调用两个参数的函数模板std::cout my_max(6, 3.2) std::endl; // 调用非模板函数return 0; }注意模板不允许自动类型转化如果有不同类型参数只允许使用非模板函数因为普通函数可以进行自动类型转换。 函数模板使用的注意项 中的每一个类型参数在函数模板参数列表中必须至少使用一次templatetypename T1, typename T2 void func(T1 t) { }全局作用域中声明的与模板参数同名的对象、函数或类型在函数模板中将被隐藏int num; templatetypename T void func(T t) {T num;coutnumendl; //输出的是局部变量num全局int类型的num被屏蔽 }函数模板中声明的对象或类型不能与模板参数同名 templatetypename Tvoid func(T t){typedef float T; //错误定义的类型与模板参数名相同}模板参数名在同一模板参数列表中只能使用一次但可在多个函数模板声明或定义之间重复使用 templatetypename T, typename T //错误在同一个模板中重复定义模板参数void func1(T t1, T t2){}templatetypename Tvoid func2(T t1){}templatetypename T //在不同函数模板中可重复使用相同的模板参数名void func3(T t1){}模板的定义和多处声明所使用的模板参数名不是必须相同//模板的前向声明 templatetypename T void func1(T t1, T t2);//模板的定义 templatetypename U void func1(U t1, U t2) { }如果函数模板有多个模板参数则每个模板参数前都必须使用关键字 class 或 typename 修饰templatetypename T, typename U //两个关键字可以混用 void func(T t, U u){}templatetypename T,U //错误每一个模板参数前都必须有关键字修饰 void func(T t, U u){}
http://www.hkea.cn/news/14573160/

相关文章:

  • 国外用python做的网站网站的前端开发
  • 中山网站建设开发备案的网站换空间
  • 网站开发培训成都顺义哪里有做网站设计的
  • 谷歌生成在线网站地图wordpress激活邮件
  • 免费建网站平台访问国外网站速度慢
  • 台州企业网站搭建价格网站建设和注册
  • 东莞市专注网站建设品牌网页设计与制作课程教学痛点
  • 杭州高端网站设计公司互联网外包公司有哪些
  • 百度生成手机网站东莞微信网站建设信息
  • 网站权限配置如何制作简易个人网站
  • 网站问卷调查怎么做静态网站flash
  • 甘肃省省建设厅网站有创意的设计工作室名字
  • 上海好的高端网站建设大学做视频网站设计
  • 自建网站多少钱慈溪企业网站
  • 郑州建站地方同城网站开发
  • 免费网站正能量app应用大全重庆微信网站建设价格
  • 网站管理后台地址怎么查询南京关键词seo公司
  • 租房网站开发wordpress issingle
  • 网站建设、微信小程序、修改wordpress图标
  • 营销网站的例子互动网站建设多少钱
  • 湘潭做网站找磐石网络一流郑州百度推广托管
  • 网站建设相关费用2023年中国进入一级战备状态了吗
  • 哪个网站做二手叉车回收好js+下载服务器wordpress
  • 匿名聊天网站怎么做腾讯广告建站工具
  • 个人网站建设知乎做翻译兼职的网站
  • 成都网站建设低价wordpress媒体库只有2m
  • 资源站 wordpresswordpress修改主页模板
  • 贵南县公司网站建设2017网络公司排名
  • 河北建站公司哪里的网站建设
  • linux 网站开发怎么样把以前做的网站删除