




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6讲类与对象的进一步讨论 对象指针 数组 参数变量作用域this指针类对象作为成员静态成员友元类模板 1 1对象指针 创建对象时 系统会为该对象分配相应的存储空间存放其数据成员 并调用构造函数 其起始地址就是对象的地址即指针 对象指针 指向对象的指针 创建对象指针 类名 对象指针名 Circlecir p 在堆中创建动态对象 用new为对象申请空间时需调用构造函数 此时创建了一个对象 如 Circle p1 newCircle 调用无参的构造函数Circle p2 newCircle 2 5 调用有参的构造函数Circle p3 newCircle 3 此时必须使用无参的构造函数 否则不能动态创建 用delete命令为对象删除空间deletep1 delete p3 不可省略 否则出现运行错误此时会自动调用析构函数 1 2对象数组及其创建 对象数组 数组中的每个数组元素都为同一类的对象 对象数组的声明根据构造函数的不同而不同 若有不需参数的构造函数 用户没定义构造函数 使用默认构造函数 有用户定义的不带参数或带默认参数的构造函数 则定义数组时可不提供实参 初始化数据 其形式为 类名数组名 常量表达式 若只有用户自定义的有参构造函数 则必须在创建对象数组时为构造函数提供实参 初始化数据 其形式为 类名数组名 常量表达式 类名 参数表 类名 参数表 当构造函数只需提供一个参数时也可写为 类名数组名 常量表达式 常量1 常量2 常量n 常量表达式表示数组的大小 创建对象数组时 系统为整个数组分配存储空间 存储每个对象元素的数据成员 并为每个对象元素调用相应的构造函数 创建对象数组例 创建对象数组 使用无参构造函数初始化数组中的元素 此时各个元素中的radius成员值均为1 Circlec 3 使用有参构造函数初始化对象元素Circlec 3 Circle 1 Circle 2 Circle 3 当构造函数只需提供一个参数时也可写为Circlec 3 1 2 3 访问数组元素对象的各公有成员 doublet1 c 1 getRadius include circle h includedoublesum Circlec intsize addcircleareas doublesum 0 for inti 0 i size i sum c i getArea returnsum printanarrayofcirclesandtheirtotalareavoidprintCircleArray Circlec intsize for inti 0 i size i cout c i getRadius t c i getArea endl cout thetotalareasofcirclesis sum c size voidmain Circleca 5 Circle 2 Circle 3 5 Circle 5 Circle 3 2 Circle 6 printCircleArray ca SIZE TotalArea cpp 对象数组范例 计算数组中所有圆的面积之和 Circleca 5 2 3 5 5 3 2 6 voidmain Clockclocks 3 Clock 11 25 10 Clock 10 25 30 Clock 8 17 20 对象数组初始化for inti 0 i 3 i clocks i showTime 若采用 Clockclocks 3 则出错 因为此时要调用无参的构造函数 修改 1 增加无参构造函数 2 改为带默认参数的构造函数 此时可写为 Clockclocks 3 includeclassClock private inthour minute second public Clock inth intm ints Clock int 0 int 0 int 0 voidshowTime Clock Clock inth intt ints hour h minute m second s voidClock showTime cout hour minute second endl Clockclocks 3 1 2 3 表示给数组的三个元素中的hour赋初值 Clockclocks 3 Clock 1 2 3 表示给数组的第一个元素赋初值 其余两个元素使用无参构造函数 不可省略 1 3对象作为函数参数 对象可作为函数的参数 分为传值方式和引用方式传值方式 对象值 为形参对象分配空间 调用复制构造函数 需要额外的时间和内存空间 对象指针 为形参对象指针分配空间 减少时间和内存空间的消耗 引用方式 一般使用较多不需要额外的时间和内存空间 而且使用对象引用参数比使用指针参数更为简单 例 对象作为参数 classdeclaration circle h classCircle private doubleradius public Circle Circle double doublegetArea doublegetRadius voidsetRadius double circle cpp classdefinition include circle h Circle Circle radius 1 Circle Circle doublenewRadius radius newRadius doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 传值 调用复制构造函数cout c1 getRadius t c1 getArea endl 对象值作为参数 为形参对象分配空间 调用复制构造函数 形参值的修改不影响实参 328 27431 57 06858 includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 对象指针作为参数 在被调函数中通过指针对主调函数中对象进行修改 形参值的修改不影响实参 328 2743328 2743 includevoidChangeCircle Circle 对象引用作为参数 不为形参分配空间 形参使用实参的空间 对形参值的修改就是对实参的修改 328 2743328 2743 includevoidChangeCircle Circlec c setRadius c getRadius 2 cout c getRadius t c getArea endl voidmain Circlec1 1 5 ChangeCircle c1 传值 调用复制构造函数cout c1 getRadius t c1 getArea endl includevoidChangeCircle Circle includevoidChangeCircle Circle c c setRadius c getRadius 2 coutgetRadius getArea endl voidmain Circlec1 1 5 ChangeCircle 参数 区分三种形式 2变量作用域 变量的作用域 是指程序中变量有效的区域 变量的作用域分为 全局域 局部域和类作用域 局部变量 在函数内 或块内 声明 只能在函数内部使用 全局变量 在所有函数和类外声明 如果局部变量与全局变量同名 则在局部变量作用域同名全局变量被屏蔽 使用的是局部变量 类作用域 即类声明和类的实现范围 类的所有成员在类作用域中相互间具有无限制的访问权 类的所有成员都可以访问该类的所有数据成员和成员函数 而类内成员对类作用域以外的数据或函数进行的访问是受限制的 同样 类作用域以外的数据或函数对类内成员的访问也是受限制的 依据成员的访问权限 如果成员函数内一个局部变量与一个数据成员同名 在该函数内同名数据成员将被屏蔽 使用的是局部变量 利用作用域操作符区分全局变量和类的数据成员 includeintpp 0 全局变量classCtest public intpp voidrp private intnumber floatsocre voidCtest rp rp 函数为test类的成员函数 pp 11 该变量为全局变量pppp 100 该变量为test类的数据成员 voidmain Ctesta a rp cout pp endl 该变量为全局变量ppcout a pp endl 11100 类成员函数的局部变量隐藏了类的同名数据成员 includeclassCTest public voidf1 voidf2 voidshow cout m m endl private intm voidCTest f1 m 5 voidCTest f2 intm m为函数f2的局部变量 m 10 为局部变量m赋值 voidmain CTesta a f1 访问类的公有成员a show a f2 a show m 5m 5 3this指针 对象成员的存储 创建对象时存储空间的分配 只为对象的数据成员分配相应的存储空间 成员函数存储在代码区 创建n个对象 每个对象都有各自的数据成员存储空间 而n个对象都调用相同的函数代码段 成员函数如何区分是哪个对象在对其进行调用呢 include include Circle h voidmain Circlecircle1 circle2 circle1 getArea circle2 getArea circle1 setRadius 3 circle2 setRadius 2 5 circle1 getArea circle2 getArea 代码区 栈 getArea setRadius radius radius getRadius circle1 circle2 this指针是什么 this是一个指向调用该函数的对象的指针常量 隐含在类的成员函数中的一个对象指针参数 系统自动产生 每当成员函数被调用时 this指针自动指向调用该成员函数的对象 即this指针为当前对象的地址 this指针的系统定义格式为 类名 constthis 该指针是系统自动产生的 不需要人为定义 并且它是指针常量 不能被赋值 只能使用它 利用this指针能保证对象的每一个成员函数能够访问其对应的数据成员 从而使C 中的各个对象既具有自己的数据成员空间 同时又可共用同一个成员函数代码 this指针是每个 非静态 成员函数都有的参数 因此可在函数体中使用this指针 this指针是隐式使用的 是系统为成员函数自动生成的参数 doubleCircle getArea returnradius radius 3 14159 doubleCircle getArea Circle constthis 即在形参表表中增加一个形参为this指针 returnthis radius this radius 3 14159 在调用成员函数时 cout circle1 getArea 实际调用方式为 cout circle1 getArea 这些都是编译系统自动实现的 不必人为地在形参中增加this指针 理解this的含义 includeclassCClock public CClock inth intm ints 构造函数 CClock 析构函数 cout this this endl voidsetTime inth intm ints voidshowTime private inthour minute second 数据成员 CClock CClock inth intm ints 构造函数的定义 cout thisofconstruction this endl hour h minute m second s voidCClock setTime inth intm ints cout thisofSettime this endl hour h minute m second s voidCClock showTime cout thisofShowtime this endl cout It s hour minute second now endl include include Clock h voidmain CClockClk1 1 2 3 Clk2 4 5 6 cout 调用对象a的成员函数f 的含义 在调用成员函数f时使this指针指向对象a 从而访问对象a的成员 需要时 在成员函数中也可以显式地使用this指针 当成员函数的形参 局部变量与类中数据成员同名时 数据成员被屏蔽 因此若需要在成员函数中访问被屏蔽的数据成员 可使用this指针进行访问 形式为 this 数据成员 this 数据成员注意不能写成 this 数据成员因为成员运算符 的优先级别高于指针运算符 this指针可使用 例 Circle类定义 this classdeclaration circle h classCircle private doubleradius public doublegetArea doublegetRadius voidsetRadius double circle cpp classdefinition doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubleradius this radius radius 4对象成员 对象作为类的数据成员 C 中 类的数据成员可以是其它类的对象 称为对象成员 classCDate public CDate int int int voidDisp voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成员函数private inthour minute second 数据成员CDatedd 有对象成员的类的构造函数 为具有对象成员的类创建对象时 必然要创建对象成员 因此在创建对象时 系统首先调用对象成员的构造函数 然后再执行本类构造函数的函数体 因此必须在构造函数体前调用对象成员的构造函数 利用构造函数的初始化列表调用对象成员的构造函数 构造函数初始化列表一般形式为 类名 类名 形参表 对象成员1 实参表 对象成员2 实参表 类的非对象成员的初始化 只有一个对象成员的类的构造函数初始化列表的例子 类名 类名 形参表 对象成员 实参列表 类的非对象成员的初始化 classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成员函数private inthour minute second 数据成员CDatedd CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n 或 includeclassCDate public CDate int int int CDate voidDisp voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int int int int voidsetTime inth intm ints voiddisp 成员函数private inthour minute second 数据成员CDatedd CTime CTime inty intm intd inth intmt ints dd y m d hour h minute mt second s cout InConstructorofCTime n CTime CTime cout InDestructorofCTime n voidCTime setTime inth intm ints hour h minute m second s voidCTime disp dd Disp cout hour minute second endl voidmain CTimett 2010 11 11 11 11 11 tt disp 完整程序 有对象成员的类的构造函数的说明 如果有对象成员的类的构造函数没有调用对象成员的构造函数 此时编译后出现语法错误 Date noappropriatedefaultconstructoravailable因为此时要调用对象成员dd的无参构造函数 而CDate类中只定义了一个有参的构造函数 为此必须使用构造函数初始化列表形式来调用CDate类的构造函数 CTime CTime inty intm intd inth intmt ints hour h minute mt second s dd CDate y m d classCDate public CDate int int int 有参voidDisp voidSetDate int int int voidGetDate int classCDate public 无参构造函数CDate int 2010 int 11 int 11 voidDisp voidSetDate int int int voidGetDate int CTime CTime inty intm intd inth intmt ints hour h minute mt second s cout InConstructorofCTime n 会自动调用对象成员的无参构造函数 如果对象成员没有无参构造函数 则会出现编译错误 如果有多个对象成员 则按照类内声明的顺序依次调用它们的构造函数 析构函数的调用顺序相反 多个对象成员 classCDateTime public CDateTime int int int int int int voiddisp 成员函数private CDatedd CTimett classCDate public CDate int int int voidDisp 显示年月日voidSetDate inty intm intd voidGetDate int classCTime public CTime int int int voidsetTime inth intm ints voiddisp private inthour minute second includeclassCDate public CDate int int int CDate voidDisp 显示年月日voidSetDate inty intm intd voidGetDate int 日期类 classCTime public CTime int int int CTime voidsetTime inth intm ints voiddisp 成员函数private inthour minute second 数据成员 CTime CTime inth intmt ints hour h minute mt second s cout InConstructorofCTime n CTime CTime cout InDestructorofCTime n voidCTime setTime inth intm ints hour h minute m second s voidCTime disp cout hour minute second endl 时间类 classCDateTime public CDateTime int int int int int int CDateTime voiddisp 成员函数private CDatedd CTimett CDateTime CDateTime inty intm intd inth intmt ints dd y m d tt h mt s cout InConstructorofCDateTime n CDateTime CDateTime cout InDestructorofCDateTime n voidCDateTime disp dd Disp tt disp voidmain CDateTimett 2010 11 11 11 11 11 tt disp 日期时间类 include includeclassPoint public Point intxx 0 intyy 0 X xx Y yy Point Point classDistance private Pointp1 p2 数据成员 对象 doubledist public Distance Pointxp1 Pointxp2 构造函数doublegetDis returndist Distance Distance Pointxp1 Pointxp2 p1 xp1 p2 xp2 cout Distance构造函数被调用 endl doublex double p1 getX p2 getX doubley double p1 getY p2 getY dist sqrt x x y y voidmain Pointmyp1 1 1 myp2 4 5 Distancemyd myp1 myp2 cout Thedistanceis cout myd getDis endl 例 对象作为类的数据成员 复制构造函数 5静态成员static 静态成员staticmembers 定义类时 用关键字static声明的数据成员或成员函数称为静态成员 staticdatafield静态数据成员存储在静态存储区 只有一个 因此该类所有对象的静态数据成员都共用同一个存储空间 即静态数据成员被类的所有对象共享 staticfunction静态成员函数 没有this指针作为参数 不能确定调用它的那个特定对象 无法访问对象的非静态成员 因此 一般只访问静态数据成员或全局变量 只能调用类的其它静态成员函数 实例成员instancemembers 非静态 是与类的特定对象联系在一起的 对于同一个类的不同对象 实例成员是不同的 通常 一个类的两个对象会拥有不同的内存空间来存放它们的实例数据成员 每个对象的数据成员互不干扰 静态成员的应用1 Circle类 classCircle private doubleradius staticintnumOfObjects 表示已创建圆类对象的个数public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double returnthenumberofcircleobjectsstaticintgetNumberOfObjects 返回已创建对象个数 circle h 静态数据成员的初始化 静态数据成员必须在类外进行初始化 不能在类定义体内初始化 类是一种描述并非具体实现 初始化时必须加类名限定 且不加static 未初始化时系统自动赋初值为0 数据类型类名 静态数据成员 初值 数据类型类名 静态数据成员 intCircle numberOfObjects 0 无论建立多少个该类的对象 编译器只为静态数据成员分配一份内存空间 供该类的各个对象公用 静态数据成员可以为public或者private 此时必须定义静态成员函数 静态成员函数 静态成员函数的调用形式类名 静态函数名 实参列表 较好 提高可读性对象名 静态函数名 实参列表 在类声明中将某个成员函数声明为静态后 在类实现中不能再使用static关键字 否则出现编译错误 静态成员函数没有this指针 因此它不能直接访问对象中的非静态数据成员 一般只用于访问静态数据成员或全局变量 只能调用类的其它静态成员函数 如果静态成员函数要对对象的非静态数据成员进行操作 则对象必须以参数的形式传递给静态成员函数 指出它作用在哪个对象上 此时需要使用 对象名 成员名 无this 非静态成员函数可以直接访问类的任意成员 静态和非静态成员 include circle h intCircle numberOfObjects 0 Circle Circle radius 1 numberOfObjects Circle Circle doublenewRadius radius newRadius numberOfObjects doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r intCircle getNumberOfObjects returnnumberOfObjects Circle Circle numberOfObjects Circle类的实现circle cpp 静态数据成员的初始化 静态成员函数 静态数据成员 include circle h includevoidmain Circlecir1 cout Circle getNumberOfObjects endl Circlecir2 2 cout Circle getNumberOfObjects endl cout cir1 getRadius endl cout cir1 getArea endl cout cir1 getNumberOfObjects endl cout cir2 getRadius endl cout cir2 getArea endl cout cir2 getNumberOfObjects endl testCircle cpp 类名 静态成员函数 静态成员函数的访问 include circle h intCircle numberOfObjects 0 Circle Circle radius 1 numberOfObjects Circle Circle doublenewRadius radius newRadius numberOfObjects doubleCircle getArea returnradius radius 3 14159 doubleCircle getRadius returnradius voidCircle setRadius doubler radius r intCircle getNumberOfObjects returnnumberOfObjects Circle Circle numberOfObjects 完整程序 include circle h includevoidmain Circlecir1 cout Circle getNumberOfObjects endl Circlecir2 2 cout Circle getNumberOfObjects endl cout cir1 getRadius endl cout cir1 getArea endl cout cir1 getNumberOfObjects endl cout cir2 getRadius endl cout cir2 getArea endl cout cir2 getNumberOfObjects endl Circle p1 p2 p1 newCircle cout cir1 getNumberOfObjects endl p2 newCircle cout cir2 getNumberOfObjects endl deletep2 cout cir1 getNumberOfObjects endl deletep1 cout cir2 getNumberOfObjects endl classCircle doubleradius staticintnumOfObjects public Circle Circle double Circle doublegetArea doublegetRadius voidsetRadius double staticintgetNumberOfObjects 静态成员的应用 为什么需要静态成员 以往要在一个范围内共享某个数据可设为全局对象 但如果希望在类范围内共享数据 则需要使用静态变量 staticvariable 也称为类变量 classvariable 在定义类时如何确定一个变量或函数应该是实例的还是静态的 如果变量或函数是依赖具体类实例的 那么就应该声明为实例的 例如 每个圆都有自己的半径值 半径依赖于具体的圆 因此将radius声明为Circle类的一个实例变量 而numberOfObjects不依赖于任何具体的实例 应该声明为静态的 如果变量或函数不依赖于任何类实例 那么就应该声明为静态的 例如 因为全体中国人都是 黄皮肤 中国人的肤色这个属性SkinColor 应该设为static类别 但姓名Name应为实例变量 不能为static型 否则全体中国人都是同一姓名 违背逻辑 定义枚举类型colorenumcolor YELLOW WHITE BLACK BROWN classChinese public staticcolorgetSkinColor Chinese 静态成员的应用2 Chinese类 include chinese h include includecolorChinese SkinColor YELLOW colorChinese getSkinColor Chinese Chinese类的实现chinese pp 在静态成员函数中用 对象名 成员名 访问实例数据成员 include include chinese h voidmain ChineseLi Liming Chinese getSkinColor Li Li ShowMessage ChineseWa Wangke Chinese getSkinColor Wa Wa ShowMessage testChinese cpp 6友元friend 一个类的私有成员不能在类作用域外被访问 但有时允许一些可依赖的函数和类访问 从而方便编程 在类的声明中可使用关键字friend声明友元函数和友元类 这些函数和类就能访问类的所有成员 包括私有成员 称为类的友员函数和友员类 如果友元函数 一般函数或其它类的成员函数 称为友元函数 如果友元是一个类 称为友元类 友元类中的所有成员函数都成为友元函数 友元函数是在类定义体内用friend声明的非本类成员函数 声明的形式为 在其函数声明前加friend friend返回值类型函数名 形参表 友元函数可以是一个普通的函数 也可以是其他类的成员函数 类的友元函数必须在类的定义体内声明函数原形 1 普通函数作友元函数 例 使用友元函数确定两圆的关系 用两个圆心距与两圆半径和的差值判断 若 0 相交 0 相切 0 相离Circle类表示圆类 友元函数fErr计算差值 6 1 友元函数 classCircle public Circle double double double doublegetRadius doublegetX doublegetY frienddoublefErr Circle 友元函数为普通函数例 Circle类的声明 circle h include circle h Circle Circle doublerr doublexx doubleyy radius rr x xx y yy doubleCircle getRadius returnradius doubleCircle getX returnx doubleCircle getY returny Circle类的实现 circle cpp testFriendCircle cpp include include include circle h doublefErr Circle include include time h include date h Date Date inty intm intd year y month m day d voidDate setDate inty intm intd year y month m day d voidDate print Time 2 其它类的成员函数作友元函数例 Date类中的成员函数print作为Time类的友元函数 ifndefDATE H defineDATE HclassTime classDate public Date inty 2000 intm 1 intd 1 voidsetDate inty intm intd voidprint Time endif 类的提前引用声明 date h date类的实现 date cpp ifndefTIME H defineTIME H include date h classTime public Time inth intm ints voidsetTime inth intm ints voidshowTime friendvoidDate print Time endif include include time h Time Time inth intm ints hour h minute m second s voidTime showTime cout hour minute second endl time类的实现 time cpp time类的声明time h testFriend cpp include include time h include date h voidmain Timeclk 8 10 10 Datedt 2006 10 23 dt print clk 6 2 友元类 classB friendclassA 注意 1 友元关系是不能传递的 2 友元关系是是单向的 若A是B的友元 A的成员函数可以访问B的数据成员 但B类的成员函数不可以访问A的数据成员 同函数一样 类也可以声明为另一个类的友元 称为友元类 若A为B的友元类 则A类的所有成员函数都是B类的友元函数 都可以访问B类的私有和保护成员 声明的形式为 includeclassCDate classCClock public CClock inth intm ints hour h minute m second s voidsetTime inth intm ints voidshowTime friendclassCDate private inthour minute second voidCClock setTime inth intm ints hour h minute m second s voidCClock showTime cout hour minute second endl classCDate public CDate inty 2000 intm 1 intd 1 voidsetDate inty intm intd voidprint CClock CDate CDate inty intm intd year y month m day d voidCDate setDate inty intm intd year y month m day d voidCDate print CClock 友元类例 一个文件实现 友元说明 友元提供了不同类或对象的成员函数之间 类的成员函数与一般函数之间进行数据共享的机制 通过友元 一个普通函数或者其他类的成员函数可以访问到封装于某一个类中的私有数据 友元函数不是本类的成员函数 却可以访问类中的任何成员 包括private protected public等 面向对象就是为了确保数据封装和隐藏 而友元破坏了这一原则 建议尽量不使用或少使用友元 7类模板template 为了实现代码重用 代码应该是通用的 即不受使用的数据类型和操作的影响 即无论使用什么数据类型 通用代码是不变的 C 提供了函数和类机制 可用来设计可重用软件 而模板 template 则提供了在函数和类中将类型作为参数的能力 从而可设计具有通用类型的函数或类 而编译器会在编译时将通用类型确定为一种具体的类型 函数模板类模板 用户可以为类声明一种模式 使得类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值能取任意类型 创建对象时指定类型 intmaxValue intx inty returnx y x y doublemaxValue doublex doubley returnx y x y charmaxValue charx chary returnx y x y 这三个函数几乎一样 差别仅仅在于使用的类型不同 若能定义一个具有通用类型的函数 则可以节省大量输入代码的时间 节省存储空间 并使程序更易于维护 GenericTypemaxValue GenericTypex GenericTypey returnx y x y GenericType表示可适用于所有类型 如int double char 函数模板 函数模板 C 允许定义具有通用类型的函数模板 函数模板的定义以关键字template开始 后面跟着一个参数列表 毎个参数前面都必须有关键字typename或class 即 template templateprefix 模板前缀template typename都是关键字 typename可用class代替 T typeparameter 习惯上用T表示类型参数 可象普通类型一样使用 可以用来指定函数返回类型 声明函数参数以及声明函数中的变量 提示 可以使用或指定类型参数 使用更好些 因为它含义更明确 而有可能与类声明混淆 函数模板 includetemplateTmaxValue Tx Ty returnx y x y voidmain intn 5 m 3 doubled 5 5 c 2 8 cout maxValue n m endl cout maxValue d c endl 注 函数模板不是一个真正意义上的函数 它仅仅是一个函数模型 当编译器遇到函数调用时 将依据模板给出的代码通过检验参数的数据类型 产生重载函数 类模板的定义 类是对象的抽象与描述 而类模板是类的抽象 类模板的声明形式 templateclass类名 数据成员的声明及成员函数的原型说明 成员函数的定义形式 template函数类型类名 函数名 参数列表 类模板例 数组类模板CArray 前面已介绍过的CArray类表示的是一个整型数组类 类似的还可以定义长整型数组 实型数组 字符数组类等 可分别定义多个类 另一个方法是模仿函数模板 设计能处理任意类型的数组类 这时可抽象出数组类模板 templateclassCArray public CArray intsize 创建长度为size的数组CArray CArray templateCArray CArray intsize 构造函数定义 data newT size 申请内存空间size size 设置数组元素个数 templateCArray CArray CArray templateclassCArray public CArray intsize CArray CArray 声明了类模板后 就可以用类模板定义对象了 定义类模板对象与定义一般的对象类似 区别是在定义时必须指明传递给类模板的数据类型 并将类型放在尖括号中 如CArraya 10 数据类型int将替换参数T出现的任何地方CArrayb 5 数据类型double将替换参数T出现的任何地方当使用无参的构造函数创建对象时 定义形式为 类名对象 若使用有参的构造函数创建对象时 定义形式为 类名对象 构造函数实参列表 用类模板定义对象 CArray类模板的应用testArray cpp includevoidmain CArraya 10 CArrayb 10 for inti 0 i 10 i a setAt i i b setAt i i 2 for i 0 i 10 i cout a i a getAt i t cout endl for i 0 i 10 i cout b i b getAt i t cout endl 提示 通常将类的声明和实现分隔在两个文件中 但是对于类模板 将声明和实现放在一起更
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中乐器数字化工艺的自动化生产线研究考核试卷
- 火灾现场安全评估报告撰写规范考核试卷
- 低温仓储损耗的保险产品设计策略研究考核试卷
- 国际税收考试题及答案
- 政策环境对冷冻饮品行业节能减排目标的影响评估考核试卷
- 数学高考试题及答案
- 福建体育高考试题及答案
- 军人教官考试题及答案
- 优教资格考试试题及答案
- 药学法规考试试题及答案
- 边际贡献分析
- 2017人教版一年级语文下册识字表
- 《高度参与的课堂 提高学生专注力的沉浸式教学》读书笔记思维导图PPT模板下载
- GB/T 28046.1-2011道路车辆电气及电子设备的环境条件和试验第1部分:一般规定
- 外科病应急预案嵌顿疝病人应急预案
- 孤独症康复教育人员上岗培训练习题库及答案
- 机械设备投入计划及保证措施
- 东南大学附属中大医院ECMO操作记录单
- 每月防火检查及记录表(每月一次)
- 工程项目成本预算表
- GB∕T 3639-2021 冷拔或冷轧精密无缝钢管
评论
0/150
提交评论