




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章
类的更多功能
上一章介绍了一些C++提供自定义数据类型,其中重点介绍了类和对象。本章将继续讨论类和对象。使用对象,创建对象数组通过指针和引用操作对象this指针的使用类的静态成员复制构造函数类的友元重载运算符类模板在C++/CLI中重载运算符
9.1对象数组
与普通数组一样,可以通过一个对象数组保存将一组对象。对象数组的声明方式与普通数组完全相同,例如下面声明了一个Cube类对象的对象数组:CubeobjArray[5];该语句声明了一个可以包含5个Cube对象的数组,在对象数组中的每个元素都会调用类的默认构造函数创建对象。
9.2对象的指针与引用
在面向对象编程中,类的对象与引用非常重要。因为类对象通常比较大,如果按值传递对象将非常耗时,这需要复制一个对象。传递对象的地址和引用则可以有效地避免这种情况。
9.2.1对象的指针
可以像声明其他指针变量一样,声明指向类对象的指针变量。例如,下面的这条语句声明了一个指向Cube类对象的指针变量:Cube*pCube=0;声明指向Cube类对象的指针变量后,就可以向Cube对象的地址保存到该指针变量:CubebigCube(4.6,4.2,6.2);pCube=&bigCube;通过对象指针访问对象的成员时,需要使用一个新的运算符——间接成员访问运算符“->”。
9.2.2对象的引用
在实际中,使用对象引用作函数参数要比使用对象指针作更普遍,这是因为使用对象引用作函数形参时,不仅具有用对象指针作函数参数的优点,而还可以避免复杂指针运算,从而更简单、更直接。
9.3this指针
任何成员函数在执行时都有一个隐含的this指针,它指向调用该函数的对象。如果需要,也可以在成员函数中显式地使用this指针。
9.4类的静态成员
类的数据成员和函数成员可以被声明为静态static。类的静态成员也称为类成员,因为它们不需要创建类的对象就可以访问。
9.4.1静态数据成员
将类的某个数据成员声明为static后,该数据成员就变为类的静态数据成员。静态数据成员它属于整个类,而不像普通数据成员一样属于某个对象。也就是说,类的静态数据成员不依赖于类创建的对象,通过类就可以访问。
9.4.2静态成员函数除静态数据成员外,C++也允许定义static成员函数。静态的数据成员被所有的对象共享,也就是说,静态数据成员不属于对象,而是属于类的。与静态数据成员类似,静态成员函数也是属于类的。静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,因为静态成员可以不创建对象直接通过类本身访问,这时并没有创建非静态的成员,因此无法访问。
9.5复制构造函数
复制构造函数的作用就是通过同类的现有对象,创建另一个对象。默认的复制构造函数是通过一个成员一个成员地复制现有对象,来创建新对象。
9.6类的友元
在正常情况下,类的数据成员被声明为私有成员,以隐藏它们。有时还可以把某此特定的函数看作类的“荣誉成员”,允许它们访问类对象中非公有的成员,这种函数就称为类的友元。友元可以访问类对象的任意成员,无论这些成员的访问控制特性是什么。类的友元可以分为两种:友元函数和友元类。友元类的所有成员函数与原类的一般成员具有相同的访问权限。
9.6.1类的友元函数
如果某个函数不是类的一个成员,但可以访问类的所有成员,这个函数就称为该类的友元函数。在声明友元函数时,必须在类定义中用关键字friend标识。可以在类定义中添加友元函数的原型,也可以类定义内部添加整个友元函数。虽然友元函数在类内部声明,但它不是类的成员,因此访问控制特性不适用它们。
9.6.2友元类
除了将某个函数声明为类的友元外,还可以将整个类声明为另一个类的友元类。友元类的所有成员函数都可以不受限地访问原类的成员。友元关系不是双向的。类之间的友元关系也是不可传递的,即类A是类B的友元类,类B又是类C的友元,但类A不是类C的友元。
9.7重载运算符重载
重载运算符是C++的一个重要特性。在C++中,用户定义的数据类型与基本数据类型int等一样,基本数据类型可以使用标准运算符(如+、–、*、/)进行运算,那么如何使用标准运算符实现自定义数据类型的运算呢?这就需要重载运算符。
9.7.1重载运算符的概述
实际上任何用重载运算符完成的工作都可以使用成员函数来实现。重载的运算符可以和原来的运算符含义不同。例如,重载“+”运算符,使它可以不做加法运算,而是把字符串连接起来。当然,也可以用“+”运算符来做减法运算,但是通造成理解上的混乱。几乎所有的运算符都可以重载。具体包括:(1)算术运算符+、-、*、/、%、++、--。(2)位操作运算符&、|、~、^、<<、>>。(3)逻辑运算符!、&&、||。(4)比较运算符
<、>、>=、<=、==、!=。(5)赋值运算符=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。(6)其他运算符[]、()、->、,(逗号运算符)、new、delete。除此之外,C++也规定了一些运算符不能够重载,例如:成员访问运算符“.”,作用域运算符“::”指针间接运算符“.*”,间接成员访问运算符“->”,条件运算符“?:”。
9.7.2重载双目运算符
为了使用运算符对某个自定义类对象进行处理,就需要为该类添加一个特殊的函数,实现运算符的重载。假设为Cube类重载大于“>”运算符,从而可以使用大于“>”运算符比较两个Cube类对象的体积: booloperator>(constCube&aCube)const { returnthis->Volume()>aCube.Volume(); }在这里的关键字operator表示重载运算符,operator与后面的运算符组合表示重载的运算符,这里重载了大于“>”运算符。实际上,operator>就构成一个特殊的函数名。在operator>运算符函数中,运算符右边接作数由函数定义的形式参数确定,左边操作数则由this指针隐式确定。
9.7.3重载增量运算符
自增1和自减1运算符是单目运算符,它们又有前缀和后缀运算两种形式,并且结果取决于是前缀还是后缀。为了区分这两种运算,可以将后缀运算视为双目运算符。则表达式:obj++或obj--可以被看为obj=obj+1或obj=obj-1这样,重载的后缀形式运算符就需要一个int类型的形参,前缀形式没有形参。后缀运算符的形参只是为了将其同前缀形式区别开来,除此之外它在函数实现中没有任何意义。
9.8类模板
类模板与前面介绍过的函数模板类似。类模板本身不是类,而只是编译器用来生成类代码的一种“配方”。与函数模板一样,类模板也是通过指定尖括号内的形参类型来确定创建的类,如右图所示。
9.8.1定义类模板
类模板有许多应用,最常见的应用是定义容器类。容器类是包含以特定方式组织起来的给定类型的对象集合。例如,对象数组,对象链表。当类模板的成员函数在外部定义时,必须指定成员函数的类模板类型,并且指定与类模板具有相同类型参数的函数模板。
9.9C++/CLI的应用
C++/CLI支持运算符的重载,但有一些区别。首先不能在数值类中重载赋值运算符,因为将数值类对象赋值给另一个同为对象的过程序已经定义为逐成员进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游管理考试题及答案
- 痛风护理考试题及答案
- 交通运输与物流:物流行业物流信息化建设对物流行业消费者满意度的影响报告
- 理财入门考试试题及答案
- 天津医科大学《微电影创作》2023-2024学年第二学期期末试卷
- 未来电动车技术变革对于消费者的影响研究试题及答案
- 沉浸式戏剧与社交网络营销结合的市场推广模式研究报告
- 有机化学分子连接与断裂原因分析试题及答案
- 教师教学反思与改进技术方法试题及答案
- 职场环境中的商务英语应用实例试题及答案
- 安全生产责任制培训课件
- JTG C10-2007 公路勘测规范
- 银行卡租用协议合集3篇
- 合欢花提取物的镇静和催眠作用
- 《养老护理员》-课件:职业安全和个人防护知识
- 苏尔寿泵HSB中文手册样本
- 青少年健康体重管理调查报告
- uht牛奶工艺流程
- 肿瘤护理进修汇报
- 《扩散焊专题》课件
- 《急性左心衰》课件
评论
0/150
提交评论