第 6 章(1)━━函数模板、类模板

合集下载

(完整版)六章芳酸类非甾体抗炎药物的分析习题及答案模板

(完整版)六章芳酸类非甾体抗炎药物的分析习题及答案模板

六章芳酸类非甾体抗炎药物的分析一、基本要求1.掌握:芳酸类非甾体抗炎药物的结构和性质;主要芳酸类药物的鉴别、检查和含量测定的原理与特点。

2.熟悉:主要芳酸类非甾体抗炎药物杂质的结构、危害、检查方法与含量限度。

3.了解:影响芳酸类非甾体抗炎药物稳定性的主要因素,体内样品与临床监测。

二、基本内容非甾体抗炎药( Non-steroidal Anti-inflammatory Drugs,NSAIDs)是一类不含有甾体骨架的抗炎药,是目前临床使用最多的药物种类之一。

本类药物具有不同的化学结构,但多数具有芳酸基本结构,即芳基取代羧酸结构。

根据芳基在羧酸的取代位置及芳基上的取代基的不同,芳酸类药物可分为水杨酸(邻羟基苯甲酸)、邻氨基苯甲酸、邻氨基苯乙酸、芳基丙酸、吲哚乙酸及苯并噻嗪甲酸等六类。

尼美舒利和对乙酰氨基酚在结构上不属于芳酸类,但作为较常用的非甾体抗炎药将在本章一并介绍。

本类药物的结构特点为同时具有游离羧基和苯环,其酸性特征可作为原料药的含量测定基础,即在中性乙醇或其他水溶性有机溶剂中,用氢氧化钠滴定液直接滴定;苯环的紫外光吸收特性常被用于本类药物的鉴别、定量检查及部分制剂的含量测定。

本类药物的酯类易子水解的特性决定了其特殊杂质检查的项目与方法,如阿司匹林中游离水杨酸的检查,ChP 曾采用三价铁比色法检查。

但由于在供试品溶液制备过程中阿司匹林的继续水解使检查结果不稳定。

所以ChP2010采用1%冰醋酸甲醇溶液制备供试品溶液,以增加阿司匹林的稳定性,同时采用高效液相色谱法( HPLC)检查,以提高检查结果的可靠性。

基于药物结构中游离羧基的酸性和芳环的紫外吸收特性,本类药物原料药的含量测定主要采用酸碱滴定法,制剂的定量检查,如溶出度(释放度)、含量均匀度等主要采用紫外一可见分光光度法,而制剂的含量测定则采用紫外一可见分光光度法和高效液相色谱法。

本类药物的分析方法见表6-1。

三、习题与解答(一)最佳选择题1.阿司匹林与碳酸钠试液共热后,再加稀硫酸酸化,产生的白色沉淀是A.苯酚B.乙酰水杨酸C.水杨酸D.醋酸E.水杨酰水杨酸2.下列药物中,不能发生三氯化铁反应的是A.二氟尼柳B.阿司匹林C.吡罗昔康D.吲哚美辛E.对乙酰氨基酚3.两步滴定法测定阿司匹林片剂的依据是A.剩余滴定法B.羧基的酸性C.酸水解定量消耗碱液D.其酯水解定量消耗碱液E.利用水解产物的酸碱性4.芳酸类药物的酸碱滴定中,常采用中性乙醇作溶剂,所谓“中性”是指A.pH =7 B.对所用指示剂显中性C.除去酸性杂质的乙醇D.对甲基橙显中性E.对甲基红显中性5.柱分配色谱一紫外分光光度法测定阿司匹林胶囊含量时,以加有碳酸氢钠的硅藻土为固定相,用三氯甲烷洗脱的是A.阿司匹林B.水杨酸C.中性或碱性杂质D.水杨酸和阿司匹林E.酸性杂质6.下列药物中,能采用重氮化一偶合反应进行鉴别的是A.阿司匹林B.美洛昔康C.尼美舒利D.对乙酰氨基酚E.吲哚美辛7.直接酸碱滴定法测定双水杨酯原料含量时,若滴定过程中双水杨酯发生水解反应,对测定结果的影响是A.偏高B.偏低C.不确定D.无变化E.与所选指示剂有关8.甲芬那酸中特殊杂质2,3-=甲基苯胺的检查,ChP2010采用的方法是A.HPLC B.TLC C.GC D.UV E.滴定法9.在试管中炽灼后生成的气体能使湿润的醋酸铅试纸显黑色的药物是A.阿司匹林B.美洛昔康C.尼美舒利D.对乙酰氨基酚E.吲哚美辛10.对乙酰氨基酚中有关物质的检查采用HPLC法进行,其流动相中加入四丁基氢氧化铵的作用是A.调节pH B.增加流动相的离子强度C.提高有关物质的保留行为D.降低有关物质的保留行为E.扫尾剂的作用(二)配伍选择题[11—12]A.对氨基酚B.游离水杨酸C.二聚体D.氯化物E.以上均不是以下药物中存在的特殊杂质是11.阿司匹林12.对乙酰氨基酚[13—16]A.加酸水解,在酸性条件下,与亚硝酸钠、碱性B一萘酚反应,显红色B.溶于硫酸后,与重铬酸钾反应显深蓝色,随即变为棕绿色C.与硝酸反虚显黄色D.与碳酸钠试液加热水解,再加过量稀硫酸酸化后生成白色沉淀,并发出醋酸的臭气E.加乙醇溶解后,加二硝基苯肼试液,加热至沸,放冷即产生橙色沉淀以下药物的鉴别反应是13.甲芬那酸14.酮洛芬15.对乙酰氨基酚16.阿司匹林[17—19]A.高效液相色谱法C.原子吸收分光光度法E.薄层色谱法下列药物杂质的检查方法为B.气相色谱法D.紫外分光光度法17.甲芬那酸中2,3-=甲基苯胺的检查18.二氟尼柳中有关物质A的检查19.萘普生中有关物质的检查[20—22]A.用中性乙醇溶解,用氢氧化钠滴定液滴定,酚酞作指示剂B.用冰醋酸溶解,用高氯酸滴定液滴定C.高效液相色谱法测定D.紫外分光光度法测定E.在稀盐酸溶液中,用亚硝酸钠滴定液滴定,永停法指示终点下列药物的含量测定方法为20.阿司匹林21.吡罗昔康22.二氟尼柳肢囊(三)多项选择题23.能直接与三氯化铁试液反应生成有色配位化合物的药物有A.水杨酸B.阿司匹林C.吡罗昔康D.美洛昔康E.对乙酰氨基酚24.下列关于直接滴定法测定阿司匹林含量的说法,正确的有A.反应摩尔比为1:l B.用氢氧化钠滴定液滴定C.以pH 7的乙醇溶液作为溶剂D.以酚酞作为指示剂E.滴定时应在不断振摇下稍快进行25.两步滴定法测定阿司匹林片剂含量时,第一步消耗的氢氧化钠的作用有A.中和游离水杨酸B.中和阿司匹林分子中的羧基C.中和酸性杂质D.中和辅料中的酸E.水解酯键26.下列ChP2010收载的药物中,其有关物质的检查采用TLC法的有A.二氟尼柳B.布洛芬C.阿司匹林D.甲芬那酸E.吡罗昔康(四)是非判断题27.水杨酸可在碱性下与三氯化铁试液反应生成紫堇色配位化合物( )28.双水杨酸中游离水杨酸的检查采用HPLC法( )29. ChP2010中,甲芬那酸的有关物质2,3-二甲基苯胺用气相色谱法检查( )30.采用水解后剩余量滴定法测定阿司匹林含量时,需进行空白试验校正,其目的是消除空白溶剂中杂质有机酸的影响( )31.双氯芬酸钠的鉴别可以采用氯化物鉴别反应( )(五)简答题32.简述阿司匹林片两步滴定法的原理与操作要点。

第六章 多态性

第六章 多态性

多态性的分类: 多态性的分类: 通用多态:参数多态、包含多态 通用多态:参数多态、 专用多态: 专用多态:重载多态和强制多态 参数多态与类属函数和类属类相关联,本书第8章将要介 参数多态与类属函数和类属类相关联,本书第8 绍的函数模板和类模板就是这种多态。 绍的函数模板和类模板就是这种多态。由类模板实例化的各 个类都具有相同的操作,而操作对象的类型却各不相同。 个类都具有相同的操作,而操作对象的类型却各不相同。同 样地,由函数模板实例化的各个函数都具有相同的操作, 样地,由函数模板实例化的各个函数都具有相同的操作,而 这些函数的参数类型是各不相同的。 这些函数的参数类型是各不相同的。 包含多态是研究类族中定义于不同类中的同名成员函数的 多态行为,主要是通过虚函数来实现的。 多态行为,主要是通过虚函数来实现的。
虚析构函数
virtual ~类名(); 类名(); 如果一个类的析构函数是虚函数,那么, 如果一个类的析构函数是虚函数,那么,由它派生而来 的所有派生类的析构函数也是虚析构函数, 的所有派生类的析构函数也是虚析构函数,不管它是否使用 丁关键字virtual 进行说明。 丁关键字virtual 进行说明。 析构函数设置为虚函数之后,在使用指针引用时可以动 析构函数设置为虚函数之后, 态联编,实现运行时的多态, 态联编,实现运行时的多态,保证使用基类类型的指针能够 调用适当的析构函数针对不同的对象进行清理工作。 调用适当的析构函数针对不同的对象进行清理工作。 例6.4 6.5 6.6
虚函数与重载函数的关系
普通的函数重载时, 普通的函数重载时,其函数的参数或参数类型必须有所 不同,函数的返回类型也可以不同。但是, 不同,函数的返回类型也可以不同。但是,当重载一个虚函 数时,也就是说在派生类中重新定义虚函数时,要求函数名、 数时,也就是说在派生类中重新定义虚函数时,要求函数名、 返回类型、参数个数、 返回类型、参数个数、参数的类型和顺序与基类中的虚函数 原型完全相同。如果仅仅返回类型不同,其余均相同, 原型完全相同。如果仅仅返回类型不同,其余均相同,系统 会给出错误信息; 若仅仅函数名相同,而参数的个数、 会给出错误信息;·若仅仅函数名相同,而参数的个数、类 型或顺序不同,系统将它作为普通的函数重载, 型或顺序不同,系统将它作为普通的函数重载,这时将丢失 虚函数的特性。 虚函数的特性。 例6.7

ASDASD

ASDASD
#include <iostream>using namespacestd;//字符串操作类 classString {public: String (){p=NULL;}
String (char *str){p=str;} friend bool operator>(String &string1,String &string2); friend bool operator<(String &string1,String &string2); friend bool operator==(String &string1,String &string2);voiddisplay();private:char *p; };//输出 voidString::display() { cout<<p; }//运算符重载 bool operator>(String &string1,String &string2) {if(strcmp(string1.p,string2.p)>0)return true;elsereturn false; }//运算符重载 bool operator<(String &string1,String &string2) {if(strcmp(string1.p,string2.p)<0)return true;elsereturn false; }//运算符重载 bool operator ==(String &string1,String &string2) {if(strcmp(string1.p,string2.p)==0)return true;elsereturn false; }//比较 void compare(String &string1,String &string2) {if(operator>(string1,string2)==1) { string1.display();cout<<">";string2.display(); }else if(operator<(string1,string2)) { string1.display();cout<<"<";string2.display(); }else {

C++模板详解(一)

C++模板详解(一)

C++模板详解(⼀)C++模板 模板是C++⽀持参数化多态的⼯具,使⽤模板可以使⽤户为类或者函数声明⼀种⼀般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

模板是⼀种对类型进⾏参数化的⼯具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。

使⽤模板的⽬的就是能够让程序员编写与类型⽆关的代码。

⽐如编写了⼀个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型⽆法实现,要实现这些类型的交换就要重新编写另⼀个swap函数。

使⽤模板的⽬的就是要让这程序的实现与类型⽆关,⽐如⼀个swap模板函数,即可以实现int 型,⼜可以实现double型的交换。

模板可以应⽤于函数和类。

下⾯分别介绍。

注意:模板的声明或定义只能在全局,命名空间或类范围内进⾏。

即不能在局部范围,函数内进⾏,⽐如不能在main函数中声明或定义⼀个模板。

⼀、函数模板通式1、函数模板的格式: template <class形参名,class形参名,......> 返回类型函数名(参数列表) { 函数体 } 其中template和class是关见字,class可以⽤typename 关见字代替,在这⾥typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。

⼀但声明了模板函数就可以⽤模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使⽤内置类型的地⽅都可以使⽤模板形参名。

模板形参需要调⽤该模板函数时提供的模板实参来初始化模板形参,⼀旦编译器确定了实际的模板实参类型就称他实例化了函数模板的⼀个实例。

⽐如swap的模板函数形式为 template <class T> void swap(T& a, T& b){},当调⽤这样的模板函数时类型T就会被被调⽤时的类型所代替,⽐如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。

高中数学第6章幂函数、指数函数和对数函数6.1幂函数高一第一册数学

高中数学第6章幂函数、指数函数和对数函数6.1幂函数高一第一册数学

堂 小


(1)求幂函数的定义域,再判定奇偶性;
结 提

新 知
(2)先研究第一象限的图象与性质,再根据奇偶性(对称性)研究
素 养
其它象限的图象.




2.幂函数在第一象限的图象与性质



究 释
(1)α>0,幂函数的图象恒经过(0,0),(1,1),在[0,+∞)是增函
作 业

难 数.


12/9/2021
课 堂 小


学 探 新 知
∴1312>1412.
提 素 养
(2)∵y=x-1是(-∞,0)上的减函数, 课
合 作 探
且-23<-35,
时 分 层


释 疑 难
∴-23-1>-53-1.



12/9/2021

第二十一页,共五十五页。

情 景 导 学
(3)0.25-14=14-14=212,
堂 小 结 提
返 首 页
第五页,共五十五页。
2.幂函数的图象和性质





























12/9/2021

第六页,共五十五页。








使用,类,模板,需要,模板,参数列表

使用,类,模板,需要,模板,参数列表

竭诚为您提供优质文档/双击可除使用,类,模板,需要,模板,参数列表篇一:函数模板和类模板函数模板和类模板【函数模板】若函数只是参数类型不同,功能完全一样,则可以通过一段通用的、适用于多种不同数据类型的代码来完成这一工作,不禁提高代码的可重用性,还提高了软件的开发效率。

使用函数模板就是为了这一目的。

函数模板的定义形式:template类型名函数名(参数表){函数体定义}所有函数模板的定义都是用关键字tenplate开始的,该关键字之后是使用尖括号括起来的“模板参数表”。

模板参数表由用逗号分隔的模板参数构成。

1.class(或typename)标识符,指明可以接受一个类型参数,这些类型参数代表的是类型,可以是内部类型或自定义类型。

2.“类型说明符”标识符,指明可以接收一个由“类型说明符”所规定的常量作为参数。

3.templateclass标识符,指明可以接收一个类模板名作为参数。

函数模板中声明了类型参数t,表示一种抽象的类型。

当主函数调用该函数时,编译器会一函数模板为样本,生成一个函数,这一过程称为函数模板的实例化,新生成的汗水的防护称为函数模板的一个实例。

模板函数与函数重载模板函数与重载是密切相关的。

从函数模板产生的相关函数都是同名的,编译器用重载的方式调用相应的函数。

另外函数模板本身也课题用多种方式重载。

注意:虽然函数模板的使用形式与函数类似,但二者有本质的区别,这主要表现在以下方面。

i.函数模板本身在编译时不会生成任何目标代码,只有由模板生成的实例会生成目标代码。

ii.被多个源文件引用的函数模板,应当连同喊大叔体一同放入头文件中,而不能像普通函数那样,只将声明放入头文件。

iii.函数指针也只能指向模板实例,而不能指向模板本身。

函数模板应用示例:#includeusingnamespacestd;templatevoidoutputa(constt*array,intcount){}intmain(){cout }return0;运行结果:aarraycontains:12345678barraycontains:1.12.23.34.45.56.67.78.8carraycontains:welcometoseeyou!【类模板】使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、返回值或局部变量能取任意类型(包括系统预定义的和用户自定义的)。

函数模板和类模板

函数模板和类模板

群体数据:自定义类型的数据(如结构体、数组)它们都是由多个基本类型组成群体类:按面向对象的方法将数据与操作封装起来组成类群体分为线性群体(元素按位置排列)和非线性群体(不按位置顺序标识)。

关于群体数据,只介绍排序和查找排序需要两种操作:比较两数的大小;调整元素在序列中的位置。

(直接插入排序、直接选择排序、起泡排序方法)查找:在序列中找出特定数据元素。

(顺序查找、折半查找方法)对群体类和群体数据采用模板形式。

函数模板和类模板函数模板和类模板模板可以实现参数多态化,就是将程序所处理的对象(对象中包括数据和函数)的类型进行参数化,使得同一程序可处理多种不同类型的对象。

1、函数模板用一个函数处理多种类型的数据,实现程序的重用性。

函数模板的定义:template<class T>或template<typename T>类型名(即返回值类型)函数名(参数表){函数体}主函数中采用不同的返回值类型或参数类型来调用这个函数模板,实现不同数据类型的输出。

2、类模板使用类模板可以使用户为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值取任意类型。

类是对公共性质的抽象,类模板是对不同类的公共性质的抽象。

类模板声明语法:template <模板参数表>class 类名{类成员声明;}有一点不好,受到限制:各个成员(数据成员、函数成员)中需要变化的类型通常要用到模板的类型参数T。

在类模板以外定义成员函数:(成员函数的实现)template <模板参数表>类型名类名<T>::函数名(参数表){函数体}通常模板参数表是这样的:class T。

类型名为T。

对模板参数表的说明:模板参数表是由逗号分隔的若干类型标识符或者常量表达式构成,内容一般包括下面两个:1、class(或typename)标识符,目的是指明一个类型参数2、类型说明符标识符,目的是指明一个常量参数,这个常量参数是由“类型说明符”规定。

《高级语言程序设计(C++)》考核大纲

《高级语言程序设计(C++)》考核大纲

高级语言程序设讨(C++)课程考核大纲一、适应对象修读完本课程规定内容的光电信息科学与工程、电子科学与技术专业的本科生;提出并获准免修本课程、申请进行课程水平考核的光电信息科学与工程、电子科学与技术专业的本科生;提出并获准副修第二专业、申请进行课程水平考核的非光电信息科学与工程、非电子科学与技术专业的本科生。

二' 考核目的考核学生分析问题的方法和基本问题的解决能力,掌握C++语言的基本内容及程序设计的基本方法与编程技巧情况,以及C++高级语言的实际操作和应用等综合能力。

三' 考核形式与方法基于本课程应用性、工程实践性强的特点,考核方式将结合平时作业、上机实验、期末工程设计的各个环节。

使学生能够注重平时学习的过程,改变学生从应试型到能力型。

考试内容侧重于知识的综合应用。

突出平时课堂表现与实践环节,平时成绩含课堂表现、作业完成质量;实践环节含实验方案设计、实验操作、实验结果分析与报告完成质量。

四' 课程考核成绩构成考核成绩构成:平时作业(30%) +上机实验(30%) +期末工程设计(40%)五、考核内容与要求(-)理论知识考核内容及要求第1章面向对象程序设计概述考核内容:1.1面向对象程序设计的基本概念面向对象程序设计的基本特性及其优点考核要求:掌握面向对象程序设计的基本概念、基本特性。

第2章C++基础考核内容:2.1C++源程序的结构C++源程序调试的基本步骤2.2标识符基本数据类型2.3C++语句数据的简单输入和输出2.4C++中标识符的作用域C++对传统C语言的一些扩充考核要求:掌握C++源程序的结构、基础及调试的基本步骤。

第3章类与对象考核内容:3.1类和对象的定义this 指针3.2构造函数与析构函数const对象和const成员函数3.3对象数组静态成员3.4友员指向类成员的指针考核要求:掌握类和对象的定义、指针及作用。

第4章继承性考核内容:4.1继承性概述继承与派生4.2单继承多继承4.3派生类中的成员重定义支配规那么、赋值兼容规那么与二义性4.4虚基类考核要求:掌握继承性的概念及类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++程序设计第6章(1)━━函数模板、类模板主要内容●关于模板●函数模板的定义●函数模板实例化●关于类模板●类模板的定义●类模板实例化●顺序表类模板的定义关于模板关于模版:①为提高程序的通用性,必须使其代码不受数据类型的限制,即建立与数据类型无关的通用函数或通用类,方法是将其中的数据类型参数化,在函数或类的定义中引入数据类型参数。

②模板是函数或类的通用样板,当函数或类需要处理多种不同类型数据时,可通过模板来创建具有通用功能的函数或类,即函数模板或类模板,以达到通用的目的。

③由于一个函数模板可以支持多个具有不同数据类型形参的函数,从而简化了重载函数的设计。

④C++国际标准ISO 14882 将模板正式引入标准库,以模板类取代传统的C++类。

⑤程序中的软件模块由模板构造,即函数模板实例化产生相应的模板函数,类模板实例化产生相应的模板类,这种程序设计类型称为参数化程序设计。

函数模板的定义函数模板的定义:template <模板形参列表> 返回值类型函数名(函数形参列表){ 函数体}①模板形参有两种:类型参数、常规参数②类型参数:由typename或class后加一个标识符构成,该标识符用在紧跟其后的函数中代表一种潜在的数据类型。

③常规参数:由类型符( 如int、float ) 后加一个标识符构成,该标识符用在紧跟其后的函数中代表一个潜在的常量。

④模板形参格式:typename 形参名class 形参名数据类型形参名①函数的返回值类型、形参类型以及函数体中,均可使用前面模板形参表中给出的类型参数来代表某种潜在的数据类型,该类型参数代表的具体类型只有在调用函数时根据给出的模板实参才能确定!②在函数体中,还可使用前面模板形参表中给出的常规参数来代表一个潜在的常量,该常规参数代表的具体值只有在调用函数时根据给出的模板实参才能确定!因此其对应的模板实参必须是常量表达式。

【例】(四个求绝对值的重载函数)#include<iostream.h>int abs ( int x ){return ( x>0 ? x : -x ) ; } long abs ( long x ){return ( x>0 ? x : -x ) ; } float abs ( float x ){return ( x>0 ? x : -x ) ; } double abs ( double x ) {return ( x>0 ? x : -x ) ; } void main ( ){ int a = -96 ; long b = 78 ;float c = -3.6 ; double d = 5.8 ; cout << “|a|=” << abs (a)<< endl ; cout << “|b|=” << abs (b)<< endl ; cout << “|c|=” << abs (c)<< endl ; cout << “|d|=” << abs (d)<< endl ; }(求绝对值的函数模板)#include<iostream.h>template < typename T>T abs ( T x ){return ( x>0 ? x : -x ) ; }void main ( ){ int a = -96 ; long b = 78 ;float c = -3.6 ; double d = 5.8 ;cout<< “|a|=” << abs<int>(a)<<endl ; cout<< “|b|=” << abs<long>(b)<<endl ; cout<< “|c|=” << abs<float>(c)<<endl ; cout<< “|d|=” << abs<double>(d)<<endl ; }函数模板函数重载指具有相同函数名,但根据不同参数确定不同入口,解决不同问题。

若这些同名函数只是在“返回值类型”或“参数类型”上不同,可通过一个通用的函数模板,替代多个具有不同类型形参的函数。

运行:| a | = 96| b | = 78| c | = 3.6| d | = 5.8●函数模板实例化:①编译系统生成函数模板的某个具体函数版本的过程称为函数模板实例化,每一个实例就是一个模板函数。

②编译系统根据每一次函数调用时所(显式或隐式)给出的类型实参生成相应的函数调用式,并生成相应的函数版本,即模板函数。

在实例化过程中,用类型实参替代函数模板中相应的类型形参。

调用式中显式给出模板实参●模板函数的显式调用:函数名< 模板实参列表>(函数实参列表)【例】上例中的四次调用:cout << “|a|=” << abs< int >( a )<< endl ;cout << “|b|=” << abs< long >( b )<< endl ;cout << “|c|=” <<abs< float >( c )<< endl ;cout << “|d|=” << abs< double >( d )<< endl ;模板函数的隐式调用:函数名(函数实参列表)㈠模板实参可以有条件的省略。

当调用函数时,若模板实参表中最右边的若干个实参,其代表的类型信息可从函数实参表中获得,则相应的模板实参可省略,编译将自动补足省略的模板实参。

㈡模板实参不能省略的情况:①从函数实参表中获得的类型信息有矛盾。

②类型形参没有出现在函数形参表中。

省略调用式中没有给出模板实参【例】#include <iostream.h>template < typename T > T abs( T x ) {return ( x>0 ? x : -x ) ; }void main ( ){ int a = -96 ; long b = 78 ; float c = -3.6 ; double d = 5.8 ;cout << “|a|=” << abs ( a )<< endl ;cout << “|b|=” << abs ( b )<< endl ;cout << “|c|=” << abs ( c )<< endl ;cout << “|d|=” << abs ( d )<< endl ; }运行:| a | = 96| b | = 78| c | = 3.6| d | = 5.8【例】(求数组元素中的最大值的函数模板、调用时隐式或显式给出模板实参)#include <iostream.h>template < typename T >T max ( T *p , int n ){ T max = p[ 0 ] ; for ( int i=1 ; i<n ; i++ ) if ( max < p[ i ] ) max = p[ i ] ;return max ; }void main( ){int a[ 10 ] = { 3 , 56 , 7 , -7 , -45 , 32 , 1 , 64 , 99 , 72 } ;double b[ 6 ] = { 32.4 , 99.8 , -6.5 , -78.4 , 65.4 , 2345 } ;int ta = max ( a , 10 ); //或max < int > ( a , 10 ) ;cout << “整数数组中的最大值=” << ta << endl ;double tb = max ( b , 6 ); //或max < double > ( b , 6 ) ;cout<< “实数数组中的最大值=” << tb << endl ; }运行:整数数组中的最大值= 99实数数组中的最大值= 2345函数模板实例化过程分析:①max ( a , 10 ) ;系统根据函数实参表中数组a 的类型为int ,推出此次调用T 代表int 。

②max ( b, 6 ) ;系统根据函数实参表中数组b 的类型为double ,推出此次调用T 代表double 。

③max < int > ( a , 10 ) ;显式给出模板实参为int ,此次调用T 代表int 。

④max < double > ( b , 6 ) ;显式给出模板实参为double ,此次调用T 代表double 。

【例】(两矩阵相乘函数模板、调用时显式给出模板实参)分析:a 为m ×n 矩阵,b 为n ×p 矩阵,a 乘以b 得到c 矩阵,则c 为m ×p 的矩阵。

k=n-1矩阵相乘公式: c ij = ∑ a ik × b kjk=0# include<iostream.h># include<iomanip.h>template < typename T1 , typename T2 , typename T3 > void multi ( T1 *pa , T2 *pb , T3 *pc , int m , int n , int p ){ int i , j , k ;for ( i=0 ; i<m ; i++ )for ( j=0 ; j<p ; j++ ){ pc[ i ][ j ]= 0 ;for ( k=0 ; k<n ; k++ ) pc[ i ][ j ]+= pa[ i ][ k ]* pb[ k ][ j ]; }}由此可见pa 、pb 、pc 为行指针!template < typename T >void print ( T *p , int m , int n ){ int i , j ;for (i=0 ;i<m;i++ ){for ( j=0 ; j<n ; j++ ) cout << setw( 6 ) << p[ i ][ j ] ;cout << endl ; }}void main ( ){ int a[ 2 ][ 3 ] = { { 1, 2, 3 } , { 4, 5, 6 } } ;float b[ 3 ][ 5 ] = { { 1.2, 2.1, 3.2, 4, 5 } , { 6, 7, 8, 9, 6 } , { 5, 4, 3, 2, 1 } } ; double c[ 2 ][ 5 ] ;multi < int [ 3 ], float [ 5 ], double [ 5 ]>( a , b , c , 2 , 3 , 5 ) ;cout << “矩阵a:\n” ;print< >( a , 2 , 3 ) ;//省略模板实参cout << “矩阵b:\n” ;print ( b , 3 , 5 ) ;//省略模板实参cout << “矩阵c:\n” ;print< double [ 5 ]>( c , 2 , 5 ) ;}运行:矩阵a : 1 2 34 5 6矩阵b : 1.2 2.1 3.2 4 56 7 8 9 65 4 3 2 1矩阵c :28.2 28.1 28.2 28 2064.8 67.4 70.8 73 56由此可见p 为行指针!关于类模板关于类模板:①类模板是一系列相关类的模型或样板,这些类的成员组成相同,成员函数的源代码形式也相同,所不同的只是所针对的数据类型,包括成员数据的类型、成员函数的参数类型和返回值类型。

相关文档
最新文档