C++-程序设计题解与上机指导.ppt_第1页
C++-程序设计题解与上机指导.ppt_第2页
C++-程序设计题解与上机指导.ppt_第3页
C++-程序设计题解与上机指导.ppt_第4页
C++-程序设计题解与上机指导.ppt_第5页
免费预览已结束,剩余102页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章类和对象 重点 在理解类和对象概念的基础上学习类的声明和定义 引入C 的类 class 和对象 object 的概念 建立 函数也可以是数据类型的成员 的思想 类的声明和定义构造函数 析构函数对象的创建和使用对象的数组 指针 赋值和复制静态成员共用数据的保护友元 4 0面向对象程序设计方法概述 数据函数 方法 操作 调用对象中的函数就是向该对象发消息 是对象的少量的对外接口 封装性 信息隐蔽 C 中 现实的问题空间 抽象 现实中对象类对象 类的一个实例 抽象出 C 类型变量 继承性与软件重用 利用一个已有的类建立一个新类 多态性 由继承而产生的相关的不同的类 其对象对同一消息会做出不同响应 数据函数 算法 对象1 数据函数 算法 对象2 系统 程序 消息 面向过程 面向对象 不同层次的抽象 基于对象就是基于类 C 中的类是实现面向对象程序设计的基础 面向对象软件开发规范的软件开发过程 软件工程学要解决的问题 1 面向对象分析OOA 粗略的分析任务 归纳出有关对象2 面向对象设计OOD 对类进行具体的设计 提出程序设计的思路和方法 包括算法 3 面向对象编程OOP 选定一种语言写程序 4 面向对象测试OOT 以类作为测试的基本单元5 面向对象维护OOSM OOP的特性 抽象封装和数据隐藏继承多态代码的可重用性 现实中对象类型 抽象 对象类类型 定义 4 1类的声明和实现 类和对象的关系类是对象的抽象 对象是类的具体实例 某对象的类型称为某类 或某对象是某类类型的一个变量 类类型是一种自定义的数据类型 用户要先提供类的声明和实现 然后才能使用 类型是什么 指定类型完成了3项工作 1 决定数据对象需要的内存数量2 决定如何解释内存中的位3 决定可使用数据对象执行的操作或方法对内置的基本类型来说 有关操作的信息被内置到编译器中 用户自定义的类型必须自己提供这些信息 具有根据实际需要定制新数据类型的强大功能和灵活性 类是将抽象转换为用户定义类型的C 工具 它将数据和操纵数据的方法组合成一个整体 类规范由两部分组成 类声明 类的蓝图 类方法定义 描述如何实现类成员函数 Class类名 private 私有成员声明块 protected 保护成员声明块 public 公有成员声明块 一 类的声明 指出该类包括哪些数据和操作 类头 类体 数据成员成员函数成员访问属性修饰符 分号结束 classCStudent public intnum charname 20 charsex voiddisplay 例 二 类成员访问属性 控制外部对类成员的访问 体现了类的数据隐藏性 1 private 限定为私有成员 该成员只能被本类中的成员函数和类的友元函数引用 是类中的默认访问控制 可实现信息隐蔽 2 public 公用的成员可被本类中的成员函数引用 也可被类的作用域的其他函数引用 是类的对外接口3 protected 受保护成员不能被类外访问 但可以被派生类的成员函数访问 说明 每种说明符可在类体中使用多次 访问限定符的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束 如果在类体起始点无访问说明符 系统默认定义为私有 private 访问限定符private 私有的 和protected 保护的 体现了类具有数据隐蔽性 Encapsulation classCStudent intnum public floatdata private stringname charsex public voiddisplay 类和结构体的异同C 中扩展了C中结构体struct的定义 使类和结构体具有同样的功能 但结构体中默认的成员访问限定为public 即它不天生具备信息隐蔽的特征 structCStudent 建议尽量使用类class 三 类的实现 类的成员函数的定义 函数定义 通常在类定义中 成员函数仅作声明 函数定义通常在类的声明之后 在类外进行 格式如下 返回值类型类名 函数名 参数表 函数体 其中运算符 称为作用域运算符 它指出该函数是属于哪一个类的成员函数 classCStudent intnum stringname charsex intgetnum returnnum public voiddisplay voidCStudent display cout num getnum endl cout name name endl cout sex sex endl display 类的成员具有类作用域 它们不是全局函数 四 inline成员函数在类内定义的函数默认为内联函数在类内用inline声明的函数 在类外定义 前面加inline 例 classCStudent intnum public voiddisplay1 cout hello endl inlinevoiddisplay2 inlinevoidCStudent display2 cout num num endl 内联成员函数只能在定义它们的文件中调用 类声明和成员函数定义的分离 即接口和实现的分离 用户的mymain cpp include 类声明头文件 h 类声明头文件 h 类成员函数定义文件 cpp include 类声明头文件 h mymain obj obj mymain exe 连接link 类声明和成员函数定义的分离 即接口和实现的分离 用户的mymain cpp include 类声明头文件 h 类声明头文件 h mymain obj 预先编译好的库文件 obj mymain exe 连接link 定义一种数据类型只是告诉编译系统该数据类型的构造 并没有预定内存 类只是一个样板 以此样板可以在内存中开辟出同样结构的实例 对象 五 定义对象的方法 一 对象的创建对象的静态创建1 先声明类类型 然后再定义对象CStudentstud1 stud2 classCStudentstud1 2 在声明类类型的同时定义对象classCStudent stud1 stud2 动态创建类名 指针 new类名 参数 释放delete指针 二 对象的访问 对象成员的访问方法 1 对象名 成员 为成员运算符 stu1 display 2 通过指向对象的指针访问对象成员CStuent p stu1 p 直接访问间接访问简单访问 三 对象的存储 图1各对象完全独立地安排内存的方案 注意 区别同一个类的各个不同的对象的属性是由数据成员决定的 不同对象的数据成员的内容是不一样的 而行为 操作 是用函数来描述的 这些操作的代码对所有对象都是一样的 图2各对象的代码区共用的方案 数据区 对象1 数据区 对象 数据区 对象 公共代码区 图2仅为每个对象分配一个数据区 而代码区 放所有成员函数的区域 为各对象共用 如何确定函数访问的是哪一个对象的数据成员this指针 物理实现和逻辑上关系 4 3节详讲 例 include iostream usingnamespacestdclassCStudent floatscore public intnum charsex public voidfun1 inta voiddisplay voidCStudent display cout sex num endl cout score score endl voidCStudent fun1 floata score a CStudentstud1 intmain stud1 num 9011 stud1 sex F intb cin b stud1 score 98 0 stud1 fun1 b stud1 display cout sizeof CStudent cout sizeof stu1 return0 类的简单应用 实际使用中通常利用构造函数来初始化数据成员 对象的数据成员如何初始化 类中的私有数据成员如何赋值 例 include iostream usingnamespacestdclassCStudent floatscore public intnum private voidfun1 inta public voiddisplay intc voidCStudent display intc fun1 c cout num num endl cout score score endl voidCStudent fun1 inta score a intmain CStudent p1 p1 newCStudent p1 num 9011 intb cin b p1 display b deletep1 return0 私有成员函数的使用 4 2类的默认成员函数及其定义 默认构造函数默认拷贝构造函数默认析构函数默认赋值运算符函数默认取地址运算符函数是编译器自动添加的 当功能不满足要求时用户可以按要求重新自定义这些函数 构造函数和析构函数 C 的目标是使得使用类与使用基本的内置类型尽可能相同 即要创建对象 可以定义类变量 也可以使用new为类对象分配存储空间 可以将对象作为函数的参数和返回值 也可以将一个对象赋给另一个 初始化对象 创建对象时对它的数据成员进行初始化 一种可能的初始化方法 对类的公有数据成员 可象结构体变量一样初始化 但这违背了类信息隐藏的初衷 Cstudentstu1 97101 wangdali 男 但往往存在私有数据成员 程序不能直接访问它们 而只能通过成员函数来访问这些数据成员 因此要设计合适的成员函数 才能成功的将对象初始化 为此 C 提供了特殊的成员函数 构造函数 一 构造函数 功能 构造函数是一种特殊的成员函数 它主要用于对对象成员进行初始化 给具体数值 或给指针成员分配空间等 声明和定义构造函数 具有一些特殊的性质 构造函数的名字必须与类名相同 构造函数可以有任意类型的参数 但不能具有返回值 构造函数的使用在创建对象时 系统会自动地调用构造函数 从而保证了先初始化后访问的顺序 例如 classcdemo cdemo 例如 classcdemo cdemo cdemo cdemo 例1classcomplex private doublereal imag public complex doubler doublei real r imag i doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 1 1 2 2 定义类的对象A时调用构造函数complexcomplexb 5 6 8 9 cout absofcomplexA A abscomplex endl 形参不要与数据成员同名 例2没有参数的构造函数classcomplex private doublereal imag public complex real 6 imag 8 doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 定义类的对象A时调用构造函数complexcout absofcomplexA A abscomplex endl 例3用初始化列表对简单的数据成员进行初始化classcomplex private doublereal imag public complex doubler doublei real r imag i doubleabscomplex voidmain complexA 6 0 8 0 定义类的对象A时调用构造函数complexcout absofcomplexA A abscomplex endl 说明 1 构造函数的名字必须与类名相同 否则将被当作一般的成员函数来处理 一般声明为public 2 构造函数也可采用初始化列表对简单的数据成员进行初始化 但数组和指针等成员的初始化应在构造函数体中书写 初始化列表只能用于类的构造函数 3 构造函数不能像其它成员函数那样被显式地调用 它是在创建对象的同时系统自动调用一次 4 C 提供两种调用形式 隐式调用构造函数 complexA 1 1 2 2 显式的调用构造函数 complexA comples 1 1 2 2 无参构造函数调用形式 complexA 5 在实际应用中 通常需要给每个类定义构造函数 如果没有给类定义构造函数 则编译系统自动地添加一个默认的构造函数 形如 complex complex 是一个无参空函数 一旦自定义了构造函数 系统就不再生成默认的构造函数了 classcomplex private doublereal imag public voidset doubler doublei real r imag i doubleabscomplex doublet t real real imag imag returnsqrt t voidmain complexA 定义类的对象A时调用默认构造函数complexA set 1 1 2 2 cout absofcomplexA A abscomplex endl 二 构造函数的重载 一个类中可以定义多个构造函数 以便对类对象提供不同的初始化方法 构造函数的名字相同 参数的个数或类型不同 classcomplex private doublereal imag public complex real 6 imag 8 complex doubler doublei real r imag I intmain complexa b 1 1 2 2 定义一个对象时 只能执行其中一个构造函数 例 定义了构造函数 但无默认构造函数时 classcomplex private doublereal imag public complex doublea real a imag a complex doubler doublei real r imag I intmain complexa 4 0 b 1 1 2 2 complexc 为类定义了非默认构造函数后 程序员一般必须为它提供默认构造函数 这样可禁止创建未初始化的对象 三 使用默认参数的构造函数 对于带参数的构造函数 在定义对象时必须给构造函数传递参数 否则构造函数将不被执行 但在实际使用中 有些构造函数的参数值通常是不变的 只有在特殊情况下才需要改变它的参数值 这时可以将其定义成带默认参数的构造函数 在声明构造函数时指定默认参数Complex doubler 1 doublei 1 相当于多个重载的构造函数 重载和默认参数的构造函数不应同时使用 因容易出现二义性 classcomplex private doublereal imag public complex doubler 1 doublei 1 complex complex doubler doublei real r imag I intmain complexa b 2 c 3 4 四 析构函数 析构函数也是一种特殊的成员函数 它执行与构造函数相反的操作 通常用于执行一些清理任务 如释放分配给对象的内存空间等 析构函数有以下一些特点 析构函数与构造函数名字相同 但它前面必须加一个波浪号 析构函数没有参数 也没有返回值 而且不能重载 因此在一个类中只能有一个析构函数 当撤消对象时 对象生命周期结束时 系统会自动地调用析构函数 例 classcomplex doublereal imag public complex doubler 0 0 doublei 0 0 cout construction endl real r imag i complex cout destruction endl doubleabscomplex returnsqrt real real imag imag intmain complexA 1 1 2 2 cout absofcomplexA A abscomplex endl return0 construction absofcomplexA 2 45967 destruction 结果 析构函数的作用并不是删除对象 而是在撤销对象占用的内存之前完成一些清理工作 释放资源 或用户希望在最后一次使用对象之后所执行的任何操作 每个类必须有一个析构函数 若没有显式地为一个类定义析构函数 编译系统会自动地添加一个缺省的析构函数 如 complex 对于大多数类而言 缺省的析构函数已经足够了 但是 如果在一个对象完成其操作之前需要做一些内部处理 则应该显式地定义析构函数 例如 classdata private int p public data inta p newint p a data deletep intmain datax 6 return0 例1 释放内存 classstring data private char str publie string data char s str newchar strlen s 1 strcpy str s string data deletestr intmain string datax abc return0 例2 释放内存 同一类存储类别的对象的构造和析构的执行顺序 classXYZ intmain XYZA B 构造 析构 调用构造函数和析构函数的顺序 先构造的后析构 后构造的先析构 对象的存储类别不同 生命周期不同全局对象 在主函数之前构造 主函数结束或调用exit 0 时 析构 局部自动对象 函数调用 建立对象时构造 函数结束时析构 多次调用函数 就多次构造和析构 局部静态对象 程序第一次调用函数时构造 主函数结束或调用exit 0 时 析构 其间 调用函数不构造也不析构 voidfun staticcstudentb cstudentc main cout begin endl fun cstudent p1 p1 newcstudent deletep1 fun 例 构造和析构顺序 include iostream usingnamespacestd classcstudent intnum public cstudent cstudent stu1 cstudent cstudent cout 构造函数 endl 在第一调用fun 时创建静态对象b 到整个程序结束时才撤销b 五 拷贝构造函数用已知对象创建新对象1 用已知对象初始化新对象 2 函数形参为对象3 函数的返回值为对象典型功能 将实参对象的非静态成员逐个拷贝到新创建的对象中 定义方法编译器自动添加的默认拷贝构造函数用户也可根据自己的需要自定义拷贝构造函数形式complex constcomplex 常引用 使参数值不能被改变 a是用来初始新对象的对象的引用 1 说明 何时调用 对象拷贝是初始化时进行的 功能 是已有对象的克隆 是浅复制 通常缺省的复制构造函数是能够胜任工作的 但若类中有指针类型时 按成员复制的方法有时会产生错误 与常规的赋值表达式 不同 例 当类中有指针类型时 缺省的拷贝构造函数存在的问题 classstring data private char str inti publie string data char s str newchar strlen s 1 strcpy str s i p i string data deletestr intmain string datax abc string datay x return0 对象x和y的成员str指向同一个内存空间 析构时会出问题 例 classstring data private char str inti public string data char s str newchar strlen s 1 strcpy str s string data conststring data 当类中有指针类型时 正确的处理方法是增加自己的拷贝构造函数 2 调用拷贝构造函数的几种情况程序中需要新建一个对象时 当函数的参数为类的对象时 按实参拷贝创建一个形参 函数的返回值是类的对象 拷贝创建一个无名临时对象 例 voidfun BOXb intmain BOXbox1 12 15 18 fun box1 return0 例 BOXf BOXbox1 12 15 16 returnbox1 intmain BOXbox2 f return0 六 赋值运算符函数 运算符的重载 将一个已知对象赋给另一个已创建好的对象 同类对象间赋值 基本赋值运算 不同类对象间赋值 广义赋值运算定义方法编译器自动添加的默认赋值函数 让两对象的数据成员相等 自定义赋值函数形式 student 第五章再详讲 4 3对象的创建和使用 1 对象的创建与存储静态创建动态创建2 对象的存储独立的数据成员 共享的成员函数this指针3 对象的访问方法与规则4 对象的使用 普通对象 引用 指针 对象数组 对象成员函数参数 函数的返回值 对象可为外界提供服务 向对象发消息 this指针 C 提供了一个特殊的对象指针 this指针 它指向类对象的首地址 成员函数通过这个指针可以知道自己当前属于哪一个对象 this指针是一种隐含指针 它隐含于每个类的成员函数中 this指针 幕后 工作机理 classABC private chara intb public voidinit charma intmb a ma b mb voidmain ABCob oc ob init x 12 oc init t 56 C 在编译过程中做了些简单的转换工作 1 把成员函数的调用形式进行变化 init 2 相应地把被调用的成员函数的定义形式进行变化 init ABC this charma intmb this a ma this b mb 我们可以直接显式的使用this指针例4 11构造函数等特殊成员函数中也有this指针 成员函数内部访问其他成员函数 this指针将被逐级传递下去 this指针是const指针 即编译器规定不允许在程序中修改它的值 当形式参数与数据成员同名时 需要加this classABC intx public voidset intx this x x 或 this x x voidout cout x intmain ABCp p set 5 p out return0 C 对变量的检查顺序 局部变量 类的数据成员 全局变量 4 3 2对象的访问方法与规则 对象的访问 指对对象成员的访问 1 访问方法 简单访问 直接访问 间接访问 2 访问规则 根据访问位置制订不同访问规则 内部访问及规则 在成员函数里面对本类对象的访问当前对象的访问 可直接 间接 简单本类其他对象的访问 可直接 间接内部访问可方位对象的所有成员 外部访问 在全局函数里访问任何类的对象成员 或在某类的成员函数里访问其它类的对象的成员 间接 直接只能访问公有成员 例 classdemo inta fun1 public demo intc fun2 demob demo demo intc a c demo fun1 couta endl demo fun2 demob this a b a fun1 voidmain demod1 4 d2 6 pd d1 fun2 d2 pd 错误 4 3 3对象的使用 pointp1 p2 p2 p1 对象的赋值pointp3 p1 p4 p1 对象拷贝point 指针通过函数参数传递对象函数形参为普通对象函数形参为对象指针函数形参为对象的引用 见书上例4 15 4 16 4 17 函数返回对象函数返回普通对象函数返回对象指针 被取地址对象必须要有较长的生存期 函数返回对象的引用 被返回对象必须要有较长的生存期 见书上例4 18 4 19 4 20 4 3 4对象数组 指所有数组元素都是对象的数组 若一个类有若干个对象 我们把这一系列的对象用一个数组来存放 建立对象数组时 每一个元素都要调用构造函数初始化 静态创建数组 要提供合适的初始化实参 动态创建类对象数组 这个类必须有无参构造函数或形参皆有缺省值数组元素的访问方法 下标法 地址法 指针法 指向对象的指针 注意初始化对象数组的方法 classcomplex private doublereal imag public complex doublea real a imag a complex doubler doublei real r imag i complex real imag 0 0 doubleabscomplex doublet t real real imag imag returnsqrt t 例 定义并初始化对象数组complexdemo1 5 complexdemo3 5 1 4 2 3 6 complexdemo2 5 complex 1 complex complex 1 1 2 2 cout demo1 0 abscomplex 标准格式 动态创建对象数组complex p newcomplex 3 p 0 complex 1 0 2 0 p 1 complex 3 0 delete p 必须有无参构造函数或形参皆有缺省值 4 3 5对象成员 某个类的数据成员是其他类的对象 不能为本类对象 对象成员使用时的特殊规则 对象成员的声明方式 不允许带实参含对象成员的类的构造函数 拷贝构造函数 赋值运算符函数的写法不同以往 构造和析构函数的调用顺序也有新规则 见书上4 3 5节的例子 如何解决该对象成员的初始化问题 1 含对象成员的类的构造函数 格式 类名 类名 形参列表 对象成员名1 实参列表1 对象成员名n 实参列表n 构造函数体 来自于形参列表 或为定值 如某对象成员不需传递实参 可以不出现 创建对象时 首先执行对象成员的构造函数 最后执行其构造函数的函数体 调用顺序同声明顺序 与初始化列表中顺序无关 与是否出现在初始化列表中也无关 由该类的构造函数的参数传递出对象成员需要的初始化参数 体现了类和类之间的一种关系 该类的成员函数对这个对象成员的访问属于外部访问 2 含对象成员的类的拷贝构造函数 需在初始化列表中完成各个对象成员的拷贝student student conststudent 调用顺序同构造函数有时构造函数只起到为对象成员传递实参的作用 3 含对象成员的类的析构函数 析构函数的调用顺序与构造函数相反 4 含对象成员的类的赋值运算符函数 注意对象成员的赋值 4 4静态成员 静态成员 在类定义中 它的成员 包括数据成员和成员函数 可以用关键字static声明为静态的静态成员的特性 不管这个类创建了多少个对象 静态成员只有一个拷贝 这个拷贝被所有属于这个类的对象共享 静态成员包括 静态数据成员静态成员函数 一 静态数据成员声明为static的数据成员 存储方式与一般的数据成员不同 无论建立了多少个对象 在内存中都只有一个静态数据的拷贝 静态数据成员是单独存储的 而不是对象的组成部分 静态数据成员的初始化不能在类中进行初始化 也不能通过构造函数初始化 因为在类中不给它分配内存空间 必须在类声明之外使用单独的语句初始化 一般在main 开始之前 类的声明之后的全局地带为它初始化 缺省时 静态成员被初始为0 格式 数据类型类名 静态数据成员名 初值 生存期 静态数据成员与静态变量一样 是在编译时创建并初始化 它在该类的任何对象被建立之前就存在 它可以在程序内部不依赖于任何对象被访问 到程序结束时才释放 访问方法 外部访问 静态数据成员属于类 而不像普通数据成员那样属于某一对象 因此可以使用 类名 访问公有的静态数据成员 也可通过对象名引用 对私有静态数据成员只能通过类成元函数访问 内部访问 具有类作用域 为什么要使用静态数据成员 静态数据成员的主要用途是定义类的各个对象所公用的数据 如统计总数 平均数等 而可以不必使用全局变量 依赖于全局变量的类几乎都是违反面向对象程序设计的封装原理的 classstudentintstudent total 0 char name intmain staticinttotal studentstu1 stu2 stu3 public studentstu1 stu2 stu3 name total name name 每个对象都有自己的name成员 只创建一个静态成员 二 静态成员函数前面有static声明的成员函数 静态成员函数可以定义成内联的 也可以在类外定义 在类外定义时 不要用static前缀 静态成员函数是一种特殊的成员函数 它不属于某一个特定的对象 而是属于类的 在一般的成员函数中都隐含有一个this指针 用来指向对象自身 而在静态成员函数中没有this指针 因为它不与特定的对象相联系 一般而言 静态成员函数访问的基本上是静态数据成员 最好不用静态成员函数引用非静态数据成员 调用方法1 类名 静态成员函数名 Student average 2 对象 静态成员函数名 指向对象的指针 静态成员函数名 stud1 average pstud1 average 使用静态成员函数的另一个原因是 可以用它在建立任何对象之前处理静态数据成员 这是普通成员函数不能实现的功能 比全局变量要安全 例 见书138页例4 23 4 5数据的保护 有些数据 可以在不同场合通过不同途径访问 为了保证数据的安全 即不被任意修改 可以使用const来对其属性进行限定 有关类的数据保护的限定的几种形式 常成员常对象对象的常引用指向对象的常指针指向常对象的指针变量 和对象有关的函数参数保护对象内容不被修改 一 常成员1 常数据成员用const来声明常数据成员 其值不能改变 不能被赋值 只能通过构造函数的参数初始化表对常数据成员进行初始化 例 classTime constinthour intsec public Time inth hour h sec 0 Time inth hour h sec 0 voidf cout hour hour 9 sec 30 intmain Timea1 8 a2 9 a1 f a2 f return0 2 常成员函数格式 返回类型成员函数名 形参 const声明和定义函数时都要加const 调用时不需加 功能特点 只能读本类中的数据成员而不能修改它们 除非是可变的数据成员 mutableintcount 可用常成员函数来修改它的值 常成员函数不能调用非常成员函数 防止间接修改 常成员是从类的角度 在类内声明成员的const属性 二 常对象定义对象时指定对象为常对象 格式 类名const对象名 实参表列 const类名对象名 实参表列 不允许修改常对象中的数据成员的值 常对象的数据成员为常变量且必须要有初值 由构造函数初始化 外界只能调用常对象的常成员函数 除了由系统自动调用的隐式的构造函数和析构函数 以防止修改对象中的数据成员的值 因常成员函数可以引用数据成员 但不会改变数据成员的值 可变的数据成员 mutableintcount 可用常成员函数来修改它的值 例 classd inti public inta d i 0 a 9 s i 6 f const d f const intq q i cout q intmain constdd1 d1 f cout d1 a d1 s d1 a 4 dd2 d2 f cout d2 a d2 s d2 a 4 return0 三 对象的常引用格式 const类名 引用名 对象 不能通过该引用改变对象 常用于函数形参 和指向常对象的指针变量一样 使函数执行过程中 不能通过形参改变实参的值 常引用 指向常对象的指针和常成员函数可保证调用对象不被修改 四 指向常对象的指针变量指向常对象的指针变量即可指向常对象 也可指向非常对象 不能通过该指针改变对象 只能用指向常对象的指针变量指向常对象 该指针变量本身可以改变 常用于函数形参 目的是保护形参指针所指向的对象 使它在函数执行过程中不被修改 即只想在函数中引用该对象 而不想改变它 例 Timet1 10 12 15 constTime p1 例 constTimet2 10 12 15 constTime p2 常对象和常成员对比常对象是在类外定义对象时 定义为常对象的 当然也可定义该类的非常对象 无论类内对成员如何声明 该常对象的数据成员全转变为常变量 函数成员的属性不变 若想引用常对象的数据成员 在类声明时必须声明有常成员函数 具有常成员的类即可定义非常对象也可定义常对象 完全不具备常成员的类即可定义非常对象也可定义常对象 但此时常对象没法使用 如何利用常对象和常成员当类中只有部分数据成员的值允许改变时 可将这部分数据成员声明为const 若所有数据成员的值都不许改变 可将所有数据成员声明为const 或将对象声明为常对象 通过常成员函数来引用常对象中数据成员 四 指向对象的常指针格式 类名 const指针变量名 对象地址 指针值始终保持为其初始化值 不能改变 即其指向始终不变 可将一个指针变量固定的和一个对象相联系 往往用常指针作为函数的形参 目的是不允许函数执行中改变指针变量的值 使其始终指向原来的对象 例 Timet1 10 12 15 t2 Time constptr1 对所指对象的使用没有限制 五 指向常对象的指针变量1 指向常变量的指针变量格式 const类型名 指针变量名 可用其指向 常变量非常变量不能通过该指针改变其所指变量的值 该指针可以指向不同的变量 例 inta constintb 7 constint p p p 当用指针变量作函数形参时 形参和实参的对应关系形参实参指向非const型变量的指针非const变量的地址指向const型变量的指针const变量的地址非const变量的地址 函数中不能通过形参改变其所指实参的值 例 voidfun1 char p chara q fun1 例 voidfun2 constchar p chara t fun2 2 指向常对象的指针变量只能用指向常对象的指针变量指向常对象 指向常对象的指针变量即可指向常对象 也可指向非常对象 不能通过该指针改变对象 该指针变量本身可以改变 常用于函数形参 目的是保护形参指针所指向的对象 使它在函数执行过程中不被修改 即只想在函数中引用该对象 而不想改变它 例 Timet1 10 12 15 constTime p1 例 constTimet2 10 12 15 constTime p2 fun1 ABCp fun2 ABC p fun3 constABC P 指向常对象的指针fun4 ABC constp 常指针fun5 ABC 以 常引用方式 传递对象 p3不可被修改 向函数传递对象 六 指向对象成员的指针对象成员的指针指向对象成员的指针变量1 数据成员 公有 例 double p1 4 6友元 类的主要特点之一是数据隐藏 即类的私有成员只能在类定义的范围内使用 也就是说私有成员只能通过它的成员函数来访问 但是 有时候需要在类的外部访问类的私有成员 为此 就需要寻找一种途径 在不放弃私有数据安全性的情况下 使得类外部的函数或类能够访问类中的私有成员 在C 中就用友元作为实现这个要求的辅助手段 C 中的友元为数据隐藏这堵不透明的墙开了一个小孔 外界可通过这个小孔窥视类内部的秘密 友元是一扇通向私有成员的后门 友元既可以是不属于任何类的一般函数 也可以是另一个类的成员函数 还可以是整个一个类 这样 这个类中的所有成员函数都可以成为友元函数 一 友元函数 友元函数不是当前类的成员函数 而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论