




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章C 的类和对象 本章要点 类和类对象的定义 静态类成员的定义和应用 const类对象及其成员的定义和应用 指向类成员指针的定义和应用 构造函数和析构函数的定义和调用 三种特殊的类 嵌套类 局部类和联合类 类域的基本概念 6 1循序渐进学理论 6 1 1类的定义 1 类的定义方法类是对客观事物的一种高度抽象 是具有一组相同属性和操作的集合 因此它包括两个部分的内容 数据成员和成员函数 其定义格式如下 class public private protected 2 数据成员数据成员的声明方式和变量的声明方式基本相同 格式如下 需要注意的是 在声明一个数据成员时 1 不能采用auto extern和register修饰符进行修饰 2 只有采用static修饰符声明的静态数据成员才可以被显式初始化 它具有特殊的属性 非静态数据成员只能通过构造函数才能够被初始化 若试图在类体中直接初始化非静态数据成员 会导致编译错误 3 成员函数成员函数在类体中的声明方式和普通函数的声明方式相同 其格式如下 成员函数可以在类体内被定义 也可以在类体外被定义 如果在类体外定义成员函数 必须先用域运算符 指出该成员函数所属的类 其定义格式如下 4 访问限制C 语言通过访问限定符public private和protected将类成员分成三类 公有成员 私有成员和保护成员 公有成员可以被该类的成员函数访问 也可以在程序的任意地方被任意访问 私有成员只能被该类的成员函数或者该类的友元函数访问 友元是为了增加程序的灵活性而引入的概念 允许程序中的某些函数访问类中的私有成员 保护成员对于派生类来说 就像是公有成员 可以被访问 对于程序的其他部分来说 就象是私有成员 不允许被访问 6 1 2类对象的定义 1 类对象的定义类可以被看作是一种自定义类型 用来定义具体的对象 格式如下 例如 可以用学生类Student去定义对象张三 StudentzhangShan 定义1个类对象 2 动态类对象的创建可以用new表达式创建动态的类对象 它的寿命期由程序员掌控 定义格式如下 new 其中初始值是可选项 若给出了初始值 系统会自动调用相应的构造函数初始化新创建的类对象 否则调用缺省构造函数进行初始化 采用delete表达式释放动态类对象的格式如下 delete 释放动态类对象数组的格式如下 delete 3 类对象成员的访问一般来说 在程序中必须使用点成员运算符 或者箭头成员运算符 才能访问类对象的成员 其中 用于类对象或引用 用于指向类对象的指针 假设有类对象定义如下 StudentHuangShan Student ZhengXiang 按如下方式调用类对象的成员函数average coutaverage 正确 6 1 3类对象的构造和析构 1 构造函数的概念构造函数是一种特殊的类成员函数 其函数名和类名相同 在定义类对象时 系统会自动调用该类的构造函数 完成类对象中数据成员的初始化 其声明格式如下 注意 构造函数的名称必须与类名称相同 构造函数没有任何的返回值 所以不能有返回类型 构造函数也不能被声明为const 缺省构造函数有两种定义方法 一是令参数列表为空 二是有一个或多个含有默认值的参数 例如 Student inti 0 char j 也是缺省构造函数 2 构造函数的定义习惯上 在构造函数的函数体内对数据成员进行初始化 例如 Student Student inti char j reg num i name j 另外 还有一种初始化方式 成员初始化列表 它位于参数列表和函数体之间 由冒号开头 后跟数据成员的名字和初值 初值放在圆括号内 类似于函数调用形式 例如 上述代码可以被改写为 Student Student inti char j reg num i name j 3 构造函数的调用创建一个类对象时 系统会自动调用构造函数初始化类对象成员 程序员可以用下面方式将实参传递给构造函数 StudenthuaNan 501 Hunan 如果在定义类对象时 没有指定实参 系统会自动调用缺省构造函数 初学者易犯的错误是误用空括号 例如 StudenthuaNan 错误 StudenthuaNan 正确 系统自动调用缺省构造函数 4 拷贝构造函数当用一个类对象显式初始化另一个类对象 或者把一个类对象作为实参传递给函数 或者将类对象作为函数的返回值 或者将一个类对象插入容器中时 系统会自动生成一个特殊的拷贝函数 依次拷贝类对象中的每一个非静态数据成员 有时 缺省按成员初始化不能满足实际需求 甚至会导致错误 C 语言提供拷贝构造函数来改变缺省按成员初始化过程 拷贝构造函数的函数名和类名相同 参数为指向类对象的引用 定义格式如下 函数体 5 析构函数析构函数也是一种特殊的成员函数 当类对象离开它所在的域 或者delete一个指向类对象的指针时 会被系统自动调用 析构函数并不是必需的 主要用于释放互斥锁 或者释放由new表达式分配的内存 或者完成类对象结束时需要执行的特殊操作 析构函数的函数名和类名相同 并在前面加一个波浪号 没有任何参数 不返回任何值 声明格式如下 6 1 4this指针 在定义类对象时 每一个类对象都会拥有一份独立的非静态的数据成员 而共享同一份成员函数拷贝 显然 这样做的好处是可以节约存储空间 但是 在程序运行过程中 类对象是如何将成员函数绑定到属于它们自己的数据成员上的呢 this指针就是完成这项绑定任务的 上帝之手 所谓this指针 就是指向调用成员函数的类对象的指针 需要注意的是 this指针通常由系统自动隐式调用 6 1 5静态数据成员和成员函数 1 静态数据成员静态数据成员是一种特殊的数据成员 在定义类对象时 所有的类对象都共享同一份静态数据成员拷贝 其定义格式如下 static 静态数据成员通常在类体外被初始化 并且在程序中只能被初始化一次 其格式为 有两种方式可以在程序中访问静态数据成员 1 和非静态数据成员一样 通过成员访问符 或者 访问静态数据成员 AccounthuaNan amount amount amount HuaNan rate 2 由于静态数据成员的存在与对象无关 所有的类对象都共享同一份静态数据成员的拷贝 所以也可以通过类名和域运算符 来直接访问静态数据成员 amount amount amount Account rate 2 静态成员函数将只访问静态数据成员的成员函数声明为静态成员函数 格式如下 static 注意 如果在类体外定义静态成员函数 不能使用关键字static 例如 voidAccount raiseRate doublei rate i 和静态数据成员一样 可以通过成员访问符 或者 访问静态成员函数 也可以通过类名和域运算符 来直接访问它 如果不希望类对象被修改 可以将它定义为const类对象 例如 定义一个const类对象run err constWatch errrun err const类对象run err的定义带来了两个问题 第一 由于const类对象只能调用声明为const的成员函数 所以必须将成员函数声明为const成员函数 第二 如果const成员函数需要修改const类对象中的数据成员 那么必须用关键字mutable重新声明该数据成员 mutable的含义是 总能被修改 5 1 6const类对象和mutable数据成员 1 静态数据成员可以定义一个指针 使其指向类成员 其中 指向非静态数据成员的指针的定义格式如下 指向非静态数据成员的指针的使用格式如下 或者 5 1 7指向类成员的指针 2 指向成员函数的指针定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致 一是参数列表要相同 二是返回类型要相同 三是所属的类要相同 其定义格式如下 错误 类对象数组是指数组元素为类对象的数组 定义格式如下 例如 定义了一个有50个元素的类对象 并由系统自动调用缺省构造函数对每一个元素进行初始化 StudentgradeOne 50 如果没有缺省构造函数 则必须显式地调用构造函数并提供全部的实参 例如 StudentgradeOne 50 Student Tom 101 Student Jerry 102 Student Mary 103 6 1 8类对象数组 6 1 9友元 1 友元函数所谓友元函数 就是将程序中的任意一个函数 甚至是另一个类定义中的成员函数 声明为友元 它不是成员函数 出现在类定义中只是为了说明某个函数是该类的 朋友 所以不必将友元函数的声明放在成员访问权限区 public private和protected 中 而是放在类声明的开始位置 其声明格式如下 friend 其中 friend是关键字 后面跟的是函数原型 2 友元类除了函数之外 一个类也可被声明为另一个类的友元 该类被称为友元类 假设有类A和类B 若在类B的定义中将类A声明为友元 那么 类A被称作类B的友元类 它所有的成员函数都可以访问类B中的任意成员 友元类的声明格式 friendclass 每一个类体都定义了一个独立的类域 其作用范围从左花括号开始至右花括号结束 通常 类成员只有在各自的类域中才是可见的 在类域外引用类域中的成员 需要通过成员访问运算符 但是也有两种例外情况 一是在类体外定义成员函数时 可以直接使用同类中的数据成员 这种情况已经在6 1 2节中介绍过 二是在类体外初始化静态数据成员时 如果使用类域中的成员 也不需要访问运算符 因为从静态数据成员名开始 一直到该语句的结束都会被看作是类域的一部分 6 1 10类域 1 嵌套类嵌套类是指在一个类中定义的类 其外层的类被称为外围类 有两种定义嵌套类的方法 第一种方法是直接在外围类中定义嵌套类 第二种方法是在外围类外定义嵌套类 例如 classA 外围类private classB 嵌套类 声明为私有public 嵌套内中的所有成员都是公有的 6 1 11嵌套类和局部类 2 局部类局部类是指定义在一个函数体内的类 不能在局部类中定义静态数据成员 并且所有的成员函数都必须定义在类定义中 例如 voidfun classA 局部类 1 联合类的定义联合类是一种特殊的类 它只维持一个足够大的存储空间 在某一个时刻 只存储其中的一个数据成员 而不会为所有的数据成员都分配存储空间 其定义格式如下 union private public protected 联合类的数据成员不能是静态成员 引用成员 也不能是定义了构造函数 析构函数或者拷贝赋值运算符的类类型成员 6 1 12联合类 2 联合类的使用访问联合类成员的方法和访问常规类成员的方法一致 要采用类成员访问运算符 或者 例如 Value1val a 联合类Value1的类对象Value1 p newValue1 联合类Value1的类对象的指针val a ival 100 p cval
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全教育培训试题含答案及答案
- 乘车安全常识试题及答案
- 乌拉地尔试题及答案
- 高速列车气动外形优化设计-洞察阐释
- 餐饮行业智能点餐系统技术研发与应用合作协议
- 艺术品交易股东退股与艺术品鉴定协议
- 2025版权合同 知识产权(IPR)保护框架协议
- 2025三人合伙创业合同范本
- 2025合同范本股权转让合同参考格式模板
- 小学三年级英语教学工作总结
- 2024至2030年中国皮肤清洗消毒液行业深度分析及发展趋势研究预测报告
- 2025届湖北省武汉市华中师大一附中初三4月中考模拟生物试题含解析
- 内科胸腔镜简介
- 院内突发心跳呼吸骤停、昏迷、跌倒事件应急预案及程序
- 2022年山东省职业院校技能大赛高职组“HTML5交互融媒体内容设计与制作”赛项-任务书(样)
- 塘实小腾讯扣叮创意编程赛自测题附有答案
- 炼焦工中级工题库
- YDT 4560-2023-5G数据安全评估规范
- 2024年广东省中考道德与法治试卷(含答案)
- 2024年广东省中考化学真题
- 期末监测 试题 2023-2024学年教科版科学六年级下册
评论
0/150
提交评论