




已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章继承和派生类 新类从基类那里得到基类的特征 从一个或多个以前定义的类 基类 产生新类的过程 继承和派生的概念 派生类的定义方法 继承的不同方式对基类成员的访问控制 单继承的概念 定义方法 单继承派生类构造函数的执行顺序多继承的概念虚基类的概念和定义 学习目标 13 1继承与派生的概念 在C 中 所谓 继承 就是在一个已存在的类的基础上建立一个新的类 已存在的类称为 基类 或 父类 新建立的类称为 派生类 或 子类 新产生的类不仅有自己特有的成员数据和成员函数 而且有被继承类的全部成员数据和成员函数 一个基类可以派生出许多个派生类 每一个派生类又可以作为基类再派生出新的派生类 因此基类和派生类是相对而言的 一代一代地派生下去 就形成了类的继承的层次结构 继承常用来表示类属关系 不能将继承理解为构成关系 当从现存类中派生出新类时 可以对派生类做如下几种变化 全部或部分地继承基类的成员数据或成员函数 可以增加新的数据成员 可以增加新的成员函数 可以重新定义已有的成员函数 可以改变现有成员的属性 a 单一继承 一个基类可以直接派生出多个派生类 单一继承与多重继承 一个派生类只有一个直接基类的情况称为单一继承 single inheritance 如果一个派生类可以同时有多个基类 称为多重继承 multiple inheritance 这时的派生类同时得到了多个已有类的特征 派生出来的新类同样可以作为基类再继续派生出更新的类 依此类推形成一个层次结构 b 多重继承 13 1 2派生类的定义 单继承派生类的定义格式如下 class 继承方式 其中 继承方式有三种 public 公有 继承 private 私有 继承和protected 保护 继承 上述三种继承方式只能选择一个 如果没有选择 则默认为private 私有 继承 classTri doublex y z 表示三角形三边public Tri double double double 构造函数doublePeri 求三角形的周长doubleArea 求三角形的面积 classCol publicTri 公有继承Tri类 doubleh 表示三角柱体的高度public Col double double double double doubleVolu 求三角柱体的体积 在派生类的类体中 只需要声明新增的成员数据和成员函数即可 多继承的派生类定义格式如下 class 继承方式1 继承方式2 继承方式n 继承方式的解释与单继承一致 classStu intstu id 代表学生学号doublescore 代表学生成绩public Stu int double 学生类的构造函数voidShow 输出学生的信息 classEmp intsta id 代表职工工号doublesalary 代表职工工资public Emp int double 职工类构造函数voidShow 输出职工的信息 classStu Emp publicStu publicEmp public Stu Emp int double int double 新类型的构造函数voidShow 输出新类型的信息 13 1 3派生类的三种继承方式 派生类中的成员由两部分组成 一部分是从基类继承来的 一部分是派生类新增的 从基类继承来的成员在派生类中的访问权限与其继承方式是密切相关的 并且除了public protected和private之外 还有一种访问权限称为 不可访问 即无论何种继承方式 派生类中从基类继承过来的基类的私有成员在派生类中都是不可访问的 基类的私有成员在派生类中并没有成为派生类中的私有成员 只有基类的成员函数可以引用它 而不能被派生类的成员函数引用 公有继承 当派生类以公有 public 方式继承基类时 基类的公有成员和保护成员在派生类中的访问权限不变 仍为公有成员和保护成员 而基类的私有成员则如前所述 在派生类中的访问权限成为 不可访问 classA intx 私有protected inty 保护public intz 公有A inta intb intc x a y b z c voidShowA cout x t y t z endl classB publicA 公有继承 intt 私有public B inta intb intc intd A a b c t d voidShowB cout t endl voidmain Bob 1 2 3 4 定义派生类对象ob ShowA 调用派生类中继承基类的公有成员函数ob ShowB 调用派生类中新定义的公有成员函数 私有继承 当派生类以私有 private 方式继承基类时 基类的公有成员和保护成员在派生类中的访问权限全部成为私有成员 而基类的私有成员在派生类中的访问权限仍为 不可访问 当定义派生类时省略基类的继承方式时 默认的继承方式是私有 private 继承 classA intx 私有protected inty 保护public intz 公有A inta intb intc x a y b z c voidShowA cout x t y t z endl classB privateA 私有继承 intt 私有public B inta intb intc intd A a b c t d voidShowB ShowA cout t endl voidmain Bob 1 2 3 4 定义派生类对象 ob ShowA 不能在类外调用基类成员ob ShowB 调用派生类中新定义的公有成员函数 保护继承 当派生类以保护 protected 方式继承基类时 基类的公有成员和保护成员在派生类中的访问权限全部成为保护成员 而基类的私有成员在派生类中的访问权限仍为 不可访问 保护 protected 继承是一种带有 血缘 关系的继承形式 可以想象 基类无论经过多少次 保护 继承 其公有成员和保护成员在派生类内部都是允许访问的 而在类外是禁止访问的 classA intx 私有protected inty 保护public intz 公有A inta intb intc x a y b z c voidShowA cout x t y t z endl classB protectedA 保护继承 intt 私有public B inta intb intc intd A a b c t d voidShowB 公有函数 ShowA 基类中的公有变为派生类中的保护 只能在类中调用cout t endl voidmain Bob 1 2 3 4 定义派生类对象 ob ShowA 不能在类外调用基类成员ob ShowB 调用派生类中新定义的公有成员函数 不同派生方式访问权限 13 2 1单继承派生类的构造函数 派生类中包含有继承基类的成员和派生类中的新增成员 在创建派生类的对象时 不仅要给派生类中的数据成员初始化 还要给它从基类中继承过来的数据成员初始化 这样 在派生类的对象构造时 必须首先正确地构造这个对象中基类的成员 派生类构造函数的一般形式为 派生类构造函数名 总参数列表 基类构造函数名 参数列表 派生类中新增数据成员初始化语句 创建派生类对象时首先调用基类的构造函数 然后才执行派生类构造函数体内的语句 classTri 三角形类 doublea b c public Tri doublex doubley doublez a x b y c z cout 调用基类的构造函数 endl doublePeri void 周长作为函数值返回doubleArea void 面积作为函数值返回 classCol publicTri 公有继承Tri类 doubleh 表示三角柱体的高度public Col doublex doubley doublez doublet Tri x y z 三角柱体的构造函数 利用参数初始化三角形三边和高度 h t cout 调用派生类的构造函数 endl doubleVolu returnArea h voidmain Colcol 3 4 5 2 创建三角柱体对象cout col的体积 col Volu endl 求col的体积 程序运行后的结果为 调用基类的构造函数调用派生类的构造函数col的体积 12 派生类对象释放时执行析构函数的顺序与构造函数相反 先执行派生类的析构函数 Col 再执行其基类的析构函数 Tri 13 2 2多继承派生类的构造函数 在多继承的情况下 由于派生类具有多个基类 在创建派生类的对象时 同样首先构造派生类对象中基类的成员 调用基类构造函数的顺序按照它们继承时说明的顺序 而不是派生类构造函数中列举的顺序 多继承派生类构造函数的一般形式为 派生类构造函数名 总参数列表 基类1构造函数名 参数列表1 基类2构造函数名 参数列表2 基类n构造函数名 参数列表n 派生类中新增数据成员初始化语句 classStu 学生类 intstu id 代表学生学号doublescore 代表学生成绩public Stu intn doublesc 学生类的构造函数 stu id n score sc cout 调用学生类构造函数 endl voidShowA cout 学号 stu id t 成绩 score endl classEmp 职工类 intsta id 代表职工工号doublesalary 代表职工工资public Emp intn doublesa 职工类构造函数 sta id n salary sa cout 调用职工类构造函数 endl voidShowB cout 工号 sta id t 工资 salary endl classStu Emp publicEmp publicStu 在职的学生类 public Stu Emp intn1 doublesc intn2 doublesa Stu n1 sc Emp n2 sa cout 调用派生类构造函数 endl voidmain Stu Emps 10001 98 20001 2000 0 s ShowA s ShowB 程序运行后的结果为 调用职工类构造函数调用学生类构造函数调用派生类构造函数学号 10001成绩 98工号 20001工资 2000 13 2 3有子对象的派生类的构造函数 在类的数据成员中 还可以包括基类或其他类的对象 称为子对象 即对象中的对象 子对象中的数据成员在创建时同样需要初始化 所以 在派生类构造函数的初始化列表中 不仅要列举所调用的基类的构造函数 而且要列举所包含的子对象成员的构造函数 其构造函数的一般形式为 派生类构造函数名 总参数列表 基类构造函数名 参数列表 子对象名 参数列表 派生类中新增数据成员初始化语句 13 2 3有子对象的派生类的构造函数 执行派生类构造函数的顺序是 调用基类构造函数 调用顺序按照它们继承时说明的顺序 调用子对象类的构造函数 调用顺序按照它们在类中说明的顺序 执行派生类构造函数体中的内容 派生类对象释放时执行析构函数的顺序正好与构造函数相反 classBase1 intx public Base1 inta x a cout 调用基类1的构造函数 n Base1 cout 调用基类1的析构函数 n classBase2 inty public Base2 inta y a cout 调用基类2的构造函数 n Base2 cout 调用基类2的析构函数 n classDerived publicBase2 publicBase1 intz Base1b1 b2 public Derived inta intb Base1 a Base2 20 b1 200 b2 a b z b cout 调用派生类的构造函数 n Derived cout 调用派生类的析构函数 n voidmain void Derivedc 100 200 调用基类2的构造函数 调用基类1的构造函数 调用派生类的构造函数 调用派生类的析构函数 调用基类1的析构函数 调用基类2的析构函数 调用基类1的构造函数 调用基类1的构造函数 调用基类1的析构函数 调用基类1的析构函数 说明基类1的对象b1 b2 在实际应用中 使用派生类构造函数时应注意如下几个问题 当基类中有默认的构造函数或者没有定义构造函数时 派生类构造函数的定义中就可以省略对基类构造函数的调用 当基类的构造函数使用一个或多个参数时 则在派生类必须定义构造函数 提供将参数传递给基类构造函数的途径 13 3继承的冲突与支配 13 3 1冲突若一个公有的派生类是由两个或多个基类派生 当基类中成员的访问权限为public 且不同基类中的成员具有相同的名字时 出现了重名的情况 这时在派生类使用到基类中的同名的成员时 出现了不唯一性 这种情况称为冲突 在职学生类Stu Emp中一共继承了两个名为id的成员变量和两个名为Show 的成员函数 13 3 1冲突 13 3 1冲突 当多个基类存在同名成员的时候 使用类限定符进行区分 表示方法如下 类名 成员名 在上例中 如果要输出学生类的信息 表示为 s Stu Show 要输出职工类的信息 表示为 s Emp Show classA public intx voidShow cout x x n A inta 0 x a classB public intx voidShow cout x x n B inta 0 x a classC publicA publicB inty public voidSetx inta x a c1对象中有两个x成员voidSety intb y b intGety returny voidmain void Cc1 c1 Show c1对象中有两个Show 函数 这时 可以利用类作用域符 来指明数据或函数的来源 如 A x a c1 B Show 在C 中 允许派生类中新增加的成员名与其基类的成员名相同 这种同名并不产生冲突 当没有使用作用域运算符时 则派生类中定义的成员名优先于基类中的成员名 这种优先关系称为支配规则 13 3 2支配 13 3 2支配 如果基类和派生类中出现了同名成员 那么 在派生类中所定义的成员名具有支配地位 这就是继承中的支配规则 也称同名覆盖 classA public intx voidShow cout x x n classB public inty voidShow cout y y n classC publicA publicB public inty 类B和类C均有y的成员 voidmain void Cc1 c1 x 100 c1 y 200 给派生类中的y赋值c1 B y 300 给基类B中的y赋值c1 A Show c1 B Show 用作用域运算符限定调用的函数cout y c1 y n 输出派生类中的y值cout y c1 B y n 输出基类B中的y值 当派生类中新增加的数据或函数与基类中原有的同名时 若不加限制 则优先调用派生类中的成员 13 3 3赋值兼容规则 赋值的兼容规则指的是在公有派生的情况下 派生类对象和基类对象间的赋值关系 有以下三种情况 假设类derived由类base派生 派生类对象可以赋值给基类对象 derivedd baseb b d 也就是说 派生类对象中从基类继承过来的那一部分成员数据可以为基类对象中的对应的成员数据赋值 派生类对象可以初始化基类引用 derivedd base也就是说 派生类对象中从基类继承过来的那一部分成员可以有一个基类的别名br 派生类对象的地址可以赋给基类的指针 derivedd base pb 当然 只能用基类指针引用派生类对象中从基类继承过来的那一部分成员 38 classA public intx A inta 0 x a classB public inty B inta 0 y a classC publicA publicB intz public C inta intb intm A a B b z m voidShow coutShow coutx endl a1 x 100 b1 y 200 x 10y 20z 50 a1 x 10 b1 y 20 错误 13 4 1虚基类的定义 在职学生类既有学生类的特性 又有职工类的特性 但是在职学生本身是一个人 应该只有一个身份证号码 因此应该只保持一份Person类的数据 然而 如果要是不加限制地直接继承 就会造成派生类中存在多个基类拷贝的情况 13 4 1虚基类的定义 在多重派生的过程中 若欲使公共的基类在派生类中只有一份拷贝 则可以将这种基类声明为虚基类 虚基类在派生时进行声明 其声明的形式为 class派生类名 virtual访问限定符基类类名 或 class派生类名 访问限定符virtual基类类名 例如学生类定义 classStu virtualpublicPerson 学生类新增成员 同样需对职工类定义 classEmp virtualpublicPerson 职工类新增成员 这样由学生类和职工类派生出的在职学生类的定义为 classStu Emp publicStu publicEmp 在职学生类新增成员 为了保证虚基类在派生类中只继承一次 应当在该基类的所有直接派生类中声明其为虚基类 例如必须在学生类Stu和职工类Emp中都将Person类声明为虚基类 这样才能保证在派生类中只有一份Person类的拷贝 13 4 2虚基类的初始化 如果在虚基类中定义了带参数的构造函数 而且没有定义默认的构造函数 则在其所有派生类 包括直接派生或间接派生的派生类 中 通过构造函数的初始化列表直接显式调用虚基类的构造函数对其进行初始化 43 classA public intx A inta 0 x a cout 调用虚基类A构造函数 endl classB publicvirtualA public inty B inta 0 intb 0 A a y b cout 调用派生类B构造函数 endl classC publicvirtualA public intz C inta 0 intc 0 A a z c classD publicB publicC public intdx D inta1 intb intc intd inta2 B a1 b C a2 c dx d cout 调用派生类D构造函数 endl voidmain void Dd1 10 20 30 40 50 cout d1 x endl d1 x 400 cout d1 x endl cout d1 y endl 没有对虚基类构造函数的调用 用缺省的构造函数 直接在派生类中调用虚基类的构造函数 对于虚基类构造函数调用的说明如下 如果一个派生类有一个直接或间接的虚基类 那么派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用 如果未被列出 则表示使用该虚基类的默认的构造函数 在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用 则先调用虚基类的构造函数 直接或间接继承虚基类的派生类 其构造函数的成员初始化列表中都要列出对虚基类构造函数的调用 但是 只有用于创建对象的那个派生类的构造函数才真正调用虚基类的构造函数 而在初始化列表中的其他派生类对虚基类构造函数的调用并不执行 这样保证了对虚基类中数据成员只初始化一次 第14章虚函数 学习目标 理解多态性的基本思想 虚函数 14 1多态性的概念 多态性是面向对象程序设计的关键技术之一 若程序设计语言不支持多态性 不能称为面向对象的语言 利用多态性技术 可以调用同一个函数名的函数 实现完全不同的功能 14 2虚函数多态性 调用同一个函数名的函数 但实现完全不同的功能 通过虚函数或重载技术来实现 多态性分为静态和动态多态性 静态多态性是通过函数的重载或运算符的重载来实现的 动态多态性是通过虚函数来实现的 其本质是通过改变指针的指向调用不同的函数 编译时多态性 函数重载 兔子逃生 class兔子 public void逃生 老鹰a 兔子蹬鹰 void逃生 狼b 动如脱兔 派生类对象的地址可以赋给基类的指针 derivedd base pb 当然 只能用基类指针引用派生类对象中从基类继承过来的那一部分成员 基类和派生类的同名成员 class宠物 public voidspeak cout zzz class猫 public宠物 public voidspeak cout miao miao class狗 public宠物 public voidspeak cout wang wang 例 catordog 续 voidmain 宠物 p p为宠物类指针猫cat1 定义猫类对象狗dog1 定义狗类对象 根据用户输入将猫或狗对象地址赋给p指针 例如用户输入1 则执行p p speak 虚函数的定义 虚函数是基类的成员函数 定义虚函数的格式如下 virtual函数类型函数名 参数列表 函数体 关于虚函数的使用说明如下 派生类中的虚函数必须与基类中的虚函数具有相同的函数名 相同的参数列表 相同或相似的返回类型 返回类型相似是指派生类中虚函数的返回类型可以是基类虚函数返回类型的公有派生类型 派生类中与基类中虚函数同原型的成员函数 也一定是虚函数 在其定义中 关键字virtual可以被省略 换句话说 虚函数是可以继承的 虚函数是实现动态联编的必要条件 但不是惟一条件 动态多态性的实现需要满足三个条件 一是类之间满足赋值兼容规则 二是要在基类中声明虚函数 三是要通过基类指针或基类引用调用虚函数 虚函数必须是类的非静态成员函数 构造函数不能是虚函数 析构函数可以是虚函数 虚函数的执行速度要稍慢一些 为了实现多态性 每一个派生类中均要保存相应虚函数的入口地址表 函数的调用机制也是间接实现的 classCircle 表示圆类 protected doubler 表示圆的半径public Circle doublerad r rad doublePeri return2 r PI virtualdoubleArea returnPI r r classCylinder publicCircle 表示圆柱体类 doubleh 表示圆柱体的高度public Cylinder doublerad doubleheight Circle rad h height doubleArea returnPeri h classCone publicCircle 表示圆锥体类 doubleh 表示圆锥体的高度public Cone doublerad doubleheight Circle rad h height doubleArea returnPI r sqrt r r h h voidfun Circle pb 通过基类指针实现动态联编 coutArea endl voidmain Cylindercy 3 5 定义圆柱体的对象Conecn 3 5 定义圆锥体的对象cout 圆柱体的侧面积是 fun 圆锥体对象的地址为基类指针赋值 程序执行后的结果为 圆柱体的侧面积是 94 2478圆锥体的侧面积是 54 9554 14 3纯虚函数与抽象类 在基类中没有实现部分的虚函数称为纯虚函数 声明纯虚函数的一般形式是 virtual函数类型函数名 参数列表 0 说明 纯虚函数没有函数体 只是一个声明语句 后面带有分号 最后 0 表示该虚函数没有任何具体实现 只是一个形式 可以被派生类继承和改写 拥有纯虚函数的基类不能定义对象 但可以定义其指针或引用 classA protected intx public A x 1000 virtualvoidprint 0 定义纯虚函数 classB publicA 派生类private inty public B y 2000 voidprint coutprint pa y 2000z 3000 抽象类 抽象类 如果一个类中至少有一个纯虚函数 那么这个类被称为抽象类 关于抽象类的说明如下 抽象类中的纯虚函数可能是在抽象类中定义的 也可能是从它的抽象基类中继承下来且重定义的 抽象类必须用作派生其他类的基类 而不能用于直接创建对象实例 但可定义抽象类的指针或引用以实现运行时的多态性 抽象类不能用作函数参数类型 函数返回值类型或显式转换类型 抽象类不可以用来创建对象 只能用来为派生类提供一个接口规范 派生类中必须重载抽象类中的纯虚函数 否则它仍将被看作一个抽象类 第15章输入 输出流 学习目标 流的概念 基本流类体系 掌握文件的打开和关闭 读和写的操作方法 15 1C 的输入输出流 输入设备 比如键盘 向程序输入数据和程序向输出设备 比如显示器 输出数据 外存储器上的文件向程序输入数据和程序向外存储器上的文件输出数据 在输入输出的过程中 数据如流水一样从一处传输到另一处 称为输入输出流 iostream 在C 中 输入输出流被定义为类 ios类 15 1 1ios类的结构 ios类及其派生类为用户提供使用流类的接口 是流库中的一个基类 可以派生出许多流类库中的类 其层次结构如图所示 cin是istream类的对象 用户通过对cin的操作实现键盘输入 cout是ostream类的对象 用户通过cout的操作实现输出 所有istream类及ostream类的成员函数的实现及cin cout对象的定义都在标准库 iostream h 中完成的 用户只要在程序中利用语句 include包含进这个文件 就可以直接使用对象cin cout 进而通过cin cout调用标准库中已定义好的各种成员函数和运算符重载函数 对文件的输入输出是通过类ifstream ofstream及fstream的对象调用该类的成员函数来实现的 这些类的完整定义在标准库文件 fstream h 中 所以 凡有关文件的操作要在程序中使用 include语句以包含进这个文件 15 3文件流 文本文件和二进制文件使用方法 includeintk cin k cout k cin为istream类的对象 即istreamcin 且与键盘输入对应 cout为ostream类的对象 即ostreamcout 且与显示器对应 回忆1 从哪输入 输出到哪 2 如何实现 3 能否从文件输入或输出到文件 4 如何实现 15 3 1文件的概念 文件一般指存储在外部介质上的数据的集合 操作系统是以文件为单位对数据进行管理的 通过对文件名的操作存取文件 根据文件中数据的组织形式 可分为ASCII码文件和二进制文件 ASCII码文件又称为文本文件 数据是以其所对应字符的ASCII码形式存储的 即每个字节单元的内容均为字符的ASCII码 被读出后能够直接送到显示器或打印机上显示或打印出对应的字符 供人们直接阅读 二进制文件则是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放 对于字符信息 在内存就是以ASCII码的格式存放的 因此 无论存放在文本文件中或是二进制文件中 其数据的格式是一样的 但是对于数值数据 如整型数值123456 在内存中占用4个字节 其存放在二进制文件和文本文件中的数据格式如图所示 在标准库文件 fstream h 中定义了三个用于文件操作的文件类 ifstream类 是istream的派生类 类中定义了磁盘文件数据向内存输入的有关操作 即用于文件的输入 但具体的输入操作还要依靠定义该类的对象实现 ifstreaminfile 定义了输入文件类对象infile 就如同定义了cin一样 相当于建立了一个数据流入内存空间的通道 但磁盘中具体是哪个文件中的数据流入内存还要用其他语句说明 ofstream类 是ostream的派生类 定义了内存数据向磁盘文件输出的有关操作 即用于文件的输出 fstream类 是iostream的派生类 定义了磁盘文件数据向内存输入和内存数据向磁盘文件输出的有关操作 即用于文件的输入输出 打开文件 文件的打开是读写文件前所做的准备工作 具体包括 使文件通道 即定义的文件流类的对象 与具体的磁盘上的指定文件建立关联 指定欲操作的文件的打开方式 如文件是用于输入还是输出 文件是文本文件还是二进制文件等 文件的打开有两种方法 调用文件流类的构造函数 在定义文件对象时按指定的方式打开有关文件 其格式为 类名文件流对象名 磁盘文件名 打开方式 例如 ifstreaminfile a1 dat ios binary 在程序所在的当前目录下打开一个二进制文件a1 dat用于向内存空间输入数据 ofstreamoutfile b1 txt 在程序所在的当前目录下打开一个文本b1 txt用于存放内存中的输出数据 调用文件流类的成员函数open 在定义文件流类的对象后按指定的方式打开具体文件 其格式为 文件流对象名 open 磁盘文件名 打开方式 例如 ifstreaminfile infile open a1 dat ios binary 这两种打开文件方法的结果是一样的 当打开文件的操作成功 则文件流对象为非零值 反之 打开文件的操作失败 文件流对象的值为0 在程序中可以根据文件流对象的值来判断打开文件的操作是否成功 例如 ifstreaminfile infile open a1 dat ios binary if infile cout openfileerror endl 关闭文件 当打开一个文件进行读写后 应该显式地关闭该文件 用成员函数close 关闭文件 格式如下 文件流对象名 close 例如 ifstreaminfile a1 dat ios binare ios nocreate if infile cout 输入文件不存在 endl infile close 成员函数close 是无参函数 在关闭文件的过程中 系统把指定文件相关联的文件缓冲区中的数据写到文件中去 保证文件的完整性 收回与该文件相关的内存空间可供再分配 同时把指定文件名与文件流对象的关联断开 结束程序对该文件的操作 15 3 3对文本文件的操作 文本文件是由ASCII字符组成的 且其读写方式是顺序的 这些均与键盘 显示器等标准设备的性质一样 因此 当文件流对象与指定的磁盘文件建立关联后 可以将输入文件看成是键盘 输出文件看成是显示器 适合cin cout的所有操作同样适合于相应的文件流对象 文本文件的读写方法有两种 用运算符 和 输入输出标准类型的数据 include includeintmain ofstreamout grade if out cout Cannotopengradefile n return1 out C 89 5 endl out English 93 5 endl out Maths 87 endl out close 例 文本文件的操作 intmain ifstreamin grade if in cout course grade cout course grade cout course grade cout course grade n in close 例 读取上例创建的 grade 文件 并将文件内容显示在屏幕上 voidmain ifstreaminfile a1 txt ios nocreate 打开已存在的输入文件a1 txtif infile cout a i 将输入文件中的数据输入到数组中sum a i 数据求和 aver sum 10 求数据平均值for i 0 i 10 i outfile a i t 将数组中的数据输出到磁盘文件中outfile
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合同终止处理范本
- 2025年模拟口语考试题目及答案
- 2025年高中国际政治试卷及答案
- 固原假山工程制作方案(3篇)
- 2025股权转让简约合同
- 工程项目方案对接(3篇)
- 工程运维保障方案(3篇)
- 工程消杀计划方案(3篇)
- 2025 农村建设外包合同范本 产品外包合同范本
- 2025年甘肃陇南事业单位卫生岗招聘考试笔试试题【含答案】
- 乡村春晚活动方案
- 大头儿子测试题及答案
- 日本所有番号分类
- (高清版)DG∕TJ 08-7-2021 建筑工程交通设计及停车库(场)设置标准
- 《优化教学策略:打造卓越课件的秘诀》课件
- 教师专业发展-课件
- 2025年数学新课标《义务教育数学课程标准(2025年版)》解读
- 网络分析仪企业ESG实践与创新战略研究报告
- 保险行业组织发展
- 药品临床综合评价解读
- 2025年中国人寿:养老险北京分公司招聘笔试参考题库含答案解析
评论
0/150
提交评论