第12讲 多态性_第1页
第12讲 多态性_第2页
第12讲 多态性_第3页
第12讲 多态性_第4页
第12讲 多态性_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、IBM research 2003 IBM CorporationSRDS Workshop计算机学院 张荣博版权所有:沈阳航空航天大学面向对象程序设计及C+多态性多态性2q 封装性、继承性、封装性、继承性、多态性多态性构成了面向对象程序设计构成了面向对象程序设计的三大特性。的三大特性。q 多态性是指发出多态性是指发出被被接收接收时有可能导致时有可能导致完全不同的行为完全不同的行为。q 多态的分类:多态的分类: 重载多态重载多态 通过函数重载来实现(包括运算符重载)通过函数重载来实现(包括运算符重载) 强制多态强制多态 通过强制类型转换实现。通过强制类型转换实现。 包含多态包含多态 通过虚函数

2、来实现。通过虚函数来实现。 参数多态参数多态 通过模板来实现。(也叫泛型编程)通过模板来实现。(也叫泛型编程) 版权所有:沈阳航空航天大学面向对象程序设计及C+本章内容本章内容3静态绑定与动态绑定静态绑定与动态绑定1类型兼容规则类型兼容规则2虚函数(虚函数( )3抽象类(抽象类()4版权所有:沈阳航空航天大学面向对象程序设计及C+4教学目标教学目标 深入了解多态性的本质,了解虚函数机制。熟练掌握多深入了解多态性的本质,了解虚函数机制。熟练掌握多态的应用。态的应用。重点及难点重点及难点 重点:虚函数机制,多态的应用。重点:虚函数机制,多态的应用。 难点:虚函数实现多态的本质及多态的应用。难点:虚

3、函数实现多态的本质及多态的应用。版权所有:沈阳航空航天大学面向对象程序设计及C+多态的实现多态的实现5多态的实现多态的实现 编译时多态编译时多态 运行时多态运行时多态 绑定(绑定(bindingbinding,又叫联编),又叫联编) 程序自身彼此关联的过程,确定程序中的操作调用与程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。执行该操作的代码间的关系。编译过程中编译过程中绑定绑定同名操作的具体对象。同名操作的具体对象。运行过程中运行过程中动态的绑定动态的绑定同名操作的具体对象。同名操作的具体对象。版权所有:沈阳航空航天大学面向对象程序设计及C+6main ()Area(

4、)Print()版权所有:沈阳航空航天大学面向对象程序设计及C+7静态联编过程演示图版权所有:沈阳航空航天大学面向对象程序设计及C+静态绑定与动态绑定静态绑定与动态绑定8q静态绑定静态绑定静态绑定是指绑定工作出现在编译连接阶段。静态绑定是指绑定工作出现在编译连接阶段。函数重载、运算符重载,成员函数隐藏等都是静态绑定。函数重载、运算符重载,成员函数隐藏等都是静态绑定。q动态绑定动态绑定动态绑定动态绑定 是指在程序运行时进行的绑定工作。是指在程序运行时进行的绑定工作。动态绑定实际上是在运行时,自动识别对象的类型,并动态绑定实际上是在运行时,自动识别对象的类型,并确定要调用的确切的函数。本质上就是所

5、谓的多态性。确定要调用的确切的函数。本质上就是所谓的多态性。版权所有:沈阳航空航天大学面向对象程序设计及C+类型兼容规则类型兼容规则9派生类对象结构派生类对象结构classclass A A int int a,ba,b ; ;public:public:/ / 成员函数成员函数;class class B B :public A :public A int int c c; ;public:public: / / 成员函数成员函数;ab12cab基类部分基类部分子类添加部分子类添加部分456基类对象基类对象派生类对象派生类对象版权所有:沈阳航空航天大学面向对象程序设计及C+10 一个一个公有

6、派生类公有派生类的的对象对象在使用上可以被当作在使用上可以被当作基类基类的的对象对象,反之反之则禁止则禁止。( (具体表现在具体表现在4 4种情况下种情况下) )1. 1. 派生类对象可以赋值给基类对象。派生类对象可以赋值给基类对象。 derived d;/派生类对象派生类对象 base b;/基类对象基类对象 b=d;/反过来则错误反过来则错误 ab46cab基类部分基类部分子类部分子类部分456切切片片C C无对应赋值无对应赋值版权所有:沈阳航空航天大学面向对象程序设计及C+112.2.派生类的派生类的对象对象可以初始化可以初始化基类基类的的引用引用。derived d; /派生类对象派生

7、类对象base& br=d;3.3.派生类对象的派生类对象的地址地址可以赋给可以赋给基类基类的的指针指针。derived d; /派生类对象派生类对象base *pb=&d;4.4.基类基类对象的对象的地址地址不可以不可以赋给赋给派生类派生类的的指针指针。base b; /基类对象基类对象derived *pd=&b; /error版权所有:沈阳航空航天大学面向对象程序设计及C+类型兼容规则举例类型兼容规则举例12#include using namespace std;class B0/基类基类B0声明声明 int x;public:void display()coutB0:display(

8、) endl;class B1: public B0 int y;public:void display()coutB1:display()endl;class D1: public B1public:void display() coutD1:display() display(); /对象指针对象指针-成员名成员名void main() B0 b0; B1 b1; D1 d1; b0=b1; /派生类对象可以赋值给基类对象派生类对象可以赋值给基类对象b0.display();b0=d1; /派生类对象可以赋值给基类对象派生类对象可以赋值给基类对象b0.display();B0 *p; p=

9、&b0; /B0类指针指向类指针指向B0类对象类对象fun(p);p=&b1; /基类指针指向派生类的对象基类指针指向派生类的对象fun(p);p=&d1; /B0类指针指向类指针指向D1类对象类对象fun(p);B0:display()B0:display()B0:display()B0:display()B0:display()版权所有:沈阳航空航天大学面向对象程序设计及C+继承召唤多态继承召唤多态14void main() B0 b0; B1 b1; D1 d1; .B0 *p; p=&b0; /B0类指针指向类指针指向B0类对象类对象fun(p);p=&b1; /基类指针指向派生类的对

10、象基类指针指向派生类的对象fun(p);p=&d1; /B0类指针指向类指针指向D1类对象类对象fun(p);派生类的对象可以初始化基类类型引用。派生类的对象可以初始化基类类型引用。派生类对象的地址可以赋给基类类型指针。派生类对象的地址可以赋给基类类型指针。期望结果期望结果B0:display()B1:display()D1:display()版权所有:沈阳航空航天大学面向对象程序设计及C+虚函数虚函数15 虚函数虚函数是在基类中冠以关键字 virtual 的成员函数, 它提供了一种接口界面接口界面。 虚函数的定义在类的定义中,在成员函数原型之前写virtual。 class B /基类B声明

11、 public: virtual void display(); ; void B:display()coutB:display()endl; virtual 只用来说明类定义中的原型,不能用在函数实现时。版权所有:沈阳航空航天大学面向对象程序设计及C+16 虚函数具有虚函数具有继承性继承性,基类中定义了虚函数,派生类中无论是,基类中定义了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。否说明,同原型函数都自动为虚函数。同原型函数同原型函数指:指: 本质:虚函数是本质:虚函数是覆盖覆盖定义定义, ,而非重载。而非重载。 调用方式:通过调用方式:通过基类基类指针或引用指针或引用,执行时会

12、根据指针或引用,执行时会根据指针或引用指向的对象的类,决定调用相应的函数。指向的对象的类,决定调用相应的函数。版权所有:沈阳航空航天大学面向对象程序设计及C+17#include using namespace std;class B0 public:virtual void display() /虚成员函数虚成员函数 coutB0:display()endl; ;class B1: public B0 public: void display() coutB1:display()endl; ;class D1: public B1 public: void display() coutD1:

13、display()display(); int main() B0 b0, *p; B1 b1; D1 d1; p=&b0;fun(p);/调用基类调用基类B0函数成员函数成员p=&b1;fun(p);/调用派生类调用派生类B1函数成员函数成员p=&d1;fun(p);/调用派生类调用派生类D1函数成员函数成员运行结果:运行结果:B0:display()B1:display()D1:display()版权所有:沈阳航空航天大学面向对象程序设计及C+虚函数实现多态的原理虚函数实现多态的原理19class Baseint b;public:virtual void fun1(int x)virtu

14、al void fun2(int x)virtual void fun3(int x);class A: public Base int a;public:virtual void fun1(int x)virtual void fun2(int x) ;int main() Base a; A b; Base *p; p = &a; p-fun1(1); p-fun2(1); p-fun3(1); p = &b; p-fun1(2); p-fun2(2); p-fun3(2); 版权所有:沈阳航空航天大学面向对象程序设计及C+2011vptr2222vptr带虚函数内存情况不带虚函数内存情况

15、版权所有:沈阳航空航天大学面向对象程序设计及C+避免误用虚函数避免误用虚函数21子类子类隐藏隐藏父类成员函数不能传播父类成员函数不能传播“虚虚”性。性。class Basepublic:virtual void fn(int x)coutBasen; ;class Sub : public Basepublic:virtual void fn(double x)coutSubn; ;BaseBasevoid test(Base& b)b.fn(3.5);void main()test(Base();test(Sub();版权所有:沈阳航空航天大学面向对象程序设计及C+22 子类子类覆盖覆盖父类

16、成员函数才能传播父类成员函数才能传播“虚虚”性。性。 只有父、子类中的只有父、子类中的同原型函数同原型函数才谈得上覆盖。才谈得上覆盖。 同原型函数指:同原型函数指: class Basepublic:virtual void fn(int x)coutBasen; ;class Sub : public Basepublic:virtual void fn(int x)coutSubn; ;版权所有:沈阳航空航天大学面向对象程序设计及C+虚函数使用的限制虚函数使用的限制23 只有类的只有类的成员函数成员函数才可以说明为虚函数(因为虚函数仅适用于有继才可以说明为虚函数(因为虚函数仅适用于有继承关

17、系的类对象)。承关系的类对象)。 静态成员静态成员函数不能是虚函数(因为静态函数不受限于某个对象)。函数不能是虚函数(因为静态函数不受限于某个对象)。 内联函数内联函数不能是虚函数。因为内联函数是不能在运行中动态确定其不能是虚函数。因为内联函数是不能在运行中动态确定其位置的,如使虚函数在类内部实现,内联函数将失去其内联性。位置的,如使虚函数在类内部实现,内联函数将失去其内联性。 构造函数构造函数不能是虚函数,因为构造时,对象还没有确定空间。不能是虚函数,因为构造时,对象还没有确定空间。 析构函数析构函数通常声明为虚函数通常声明为虚函数, ,主要原因是防止内存无法释放。主要原因是防止内存无法释放

18、。版权所有:沈阳航空航天大学面向对象程序设计及C+虚析构函数虚析构函数24 在析构函数前面加上关键字在析构函数前面加上关键字virtualvirtual进行说明,称该析进行说明,称该析构函数为构函数为虚析构函数虚析构函数。 虚析构函数同样具有虚函数的继承性。虚析构函数同样具有虚函数的继承性。 例如:例如:class ABC ABC(); /构造函数构造函数 virtual ABC(); /虚析构函数虚析构函数 ; 版权所有:沈阳航空航天大学面向对象程序设计及C+为什么需要虚析构函数?为什么需要虚析构函数?2525class Aprotected: int a;public:A(int va)

19、cout调用调用A构造构造n; a=va;A() cout调用调用A析构析构n; ;class B : public Aprotected: int b;public: B(int va,int vb):A(va)cout调用调用B构造构造n;b=vb; B()cout调用调用B析构析构n; ;void Del(A *ptr)delete ptr; ptr=NULL;void main() A *pa=new A(1); Del(pa); cout-n; B *pb=new B(10,15); Del(pb);调用调用A A构造构造调用调用A A析构析构-调用调用A A构造构造调用调用B B构

20、造构造调用调用A A析构析构导致内存无法释放导致内存无法释放a=1papba=10b=15版权所有:沈阳航空航天大学面向对象程序设计及C+增加虚析构函数增加虚析构函数2626class Aprotected: int a;public:A(int va) cout调用调用A构造构造n; a=va;virtual A() cout调用调用A析构析构n; ;class B : public Aprotected: int b;public: B(int va,int vb):A(va)cout调用调用B构造构造n;b=vb; virtualB()cout调用调用B析构析构n; ;void fun(

21、A *ptr)delete ptr; ptr=NULL;void main() A *pa=new A(1); fun(pa); cout-n; B *pb=new B(10,15); fun(pb);调用调用A A构造构造调用调用A A析构析构-调用调用A A构造构造调用调用B B构造构造调用调用B B析构析构调用调用A A析构析构内存正常释放内存正常释放a=1papba=10b=15版权所有:沈阳航空航天大学面向对象程序设计及C+何时需要虚析构函数?何时需要虚析构函数?27 当你可能通过基类指针删除派生类对象时。当你可能通过基类指针删除派生类对象时。 如果允许如果允许 人通过基类指针调用派

22、生类对象的析构函人通过基类指针调用派生类对象的析构函数(如上例中的数(如上例中的DelDel函数),并且被析构的对象中有通函数),并且被析构的对象中有通过过newnew的方法在堆内存中申请空间的时候,就需要让基的方法在堆内存中申请空间的时候,就需要让基类的析构函数成为虚拟的。类的析构函数成为虚拟的。版权所有:沈阳航空航天大学面向对象程序设计及C+纯虚函数纯虚函数28 在不同的子类中有不同的实现,而于基类中的定义版本并无在不同的子类中有不同的实现,而于基类中的定义版本并无意义的虚函数常声明为意义的虚函数常声明为纯虚函数纯虚函数纯虚函数是在基类中说明的虚函数。纯虚函数是在基类中说明的虚函数。纯虚函

23、数本身不定义具体的操作。纯虚函数本身不定义具体的操作。纯虚函数在基类中没有函数体。纯虚函数在基类中没有函数体。纯虚函数的声明格式为:纯虚函数的声明格式为: class Accountpublic: virtual void withdrawal(double amount)=0;版权所有:沈阳航空航天大学面向对象程序设计及C+抽象类抽象类29class B0 public: /外部接口virtual void display( )=0; /纯虚函数成员 ; 带有纯虚函数的类称为带有纯虚函数的类称为抽象类抽象类。纯虚函数在派生类中可以多态地定义具体的函数体。纯虚函数在派生类中可以多态地定义具体的

24、函数体。版权所有:沈阳航空航天大学面向对象程序设计及C+30class B1: public B0/公有派生公有派生public:void display( )coutB1:display( )endl;class D1: public B1/公有派生公有派生public:void display( )coutD1:display( )endl;版权所有:沈阳航空航天大学面向对象程序设计及C+说明:说明:31 在各派生类中,重新定义了在各派生类中,重新定义了全部纯虚函数全部纯虚函数的操作。这的操作。这时的派生类就不是抽象类,就时的派生类就不是抽象类,就可以定义具体的对象可以定义具体的对象。 如

25、果派生类中如果派生类中只重新定义部分纯虚函数的操作只重新定义部分纯虚函数的操作,则派,则派生类仍然是生类仍然是抽象类抽象类。 抽象类自身抽象类自身无法实例化无法实例化,即不能定义一个抽象类的对,即不能定义一个抽象类的对象象(原因:其中有一个或多个函数没有定义)。(原因:其中有一个或多个函数没有定义)。版权所有:沈阳航空航天大学面向对象程序设计及C+32void main( ) B0 b0;/ error B1 b1;/ ok ,在派生类中重新定义了在派生类中重新定义了Display函数。函数。D1 d1;/ ok B0 *p;/ok ,不调用构造函数,不分配空间。不调用构造函数,不分配空间。版

26、权所有:沈阳航空航天大学面向对象程序设计及C+为什么需要抽象类?为什么需要抽象类?33继承体系反映的是事物的分层分类,它是倒树状,顶端是基继承体系反映的是事物的分层分类,它是倒树状,顶端是基类越顶端越抽象,越底端越具体类越顶端越抽象,越底端越具体基类往往是一种概念表达,仅仅提取了各个子类的共性,本身并基类往往是一种概念表达,仅仅提取了各个子类的共性,本身并不构成有意义的实体这种基类的成员都是为子类提供的特别不构成有意义的实体这种基类的成员都是为子类提供的特别是虚函数,不同的子类有不同的实现,在基类中的定义版本并无是虚函数,不同的子类有不同的实现,在基类中的定义版本并无意义意义抽象类为抽象和设计

27、的目的而建立,抽象类的主要作用是通过它抽象类为抽象和设计的目的而建立,抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性特性 对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。实现。版权所有:沈阳航空航天大学面向对象程序设计及C+例题例题34 一个信用卡账户一个信用卡账户Savings类类,包括账号、余额等信息,同时包括账号、余额等信息,同时包含对象创建、存款、取款及显示等操作。另有一个结包含对象创建、存款、取款及显示等操作。另有一个结算

28、账户算账户Checking类,包括账号、余额及汇款方式等信息,类,包括账号、余额及汇款方式等信息,同时包括对象创建、存款、取款(信汇、电汇、取款)、同时包括对象创建、存款、取款(信汇、电汇、取款)、显示及设置汇款方式等操作。要求设计类体系模拟银行显示及设置汇款方式等操作。要求设计类体系模拟银行存取款及汇款等操作。存取款及汇款等操作。版权所有:沈阳航空航天大学面向对象程序设计及C+35Accountdeposit()virtual display()virtual withdrawal()string acntNumberdouble balanceSavingsvirtual display(

29、)virtual withdrawal()double minBalanceCheckingvirtual display()virtual withdrawal()setRemit()REMIT remittance 账号账号余额余额透支金额透支金额汇款方式汇款方式存款存款设置汇款方式设置汇款方式显示显示取款取款覆盖显示覆盖显示覆盖取款覆盖取款覆盖显示覆盖显示覆盖取款覆盖取款版权所有:沈阳航空航天大学面向对象程序设计及C+抽象类方案设计抽象类方案设计36Accountdeposit()string GetNO()double GetM()virtual display()virtual wi

30、thdrawal()=0string acbtNumberdouble balanceSavingsvirtual display()virtual withdrawal()double minBalanceCheckingvirtual display()virtual withdrawal()setRemit()REMIT remittance 版权所有:沈阳航空航天大学面向对象程序设计及C+账户基类定义账户基类定义37/file Account.h#ifndef ACCOUNT_H#define ACCOUNT_H#include#includeusing namespace std;c

31、lass Accountprotected:string acntNumber;/账号账号double balance;/余额余额public:Account(string, double=0.0);string GetNO()return acntNumber;double GetM()return balance;void deposit(double amount)balance += amount; virtual void display()const;virtual void withdrawal(double)=0;virtual Account();#endif版权所有:沈阳航

32、空航天大学面向对象程序设计及C+38/file Account.cpp#include Account.hAccount:Account(string acntNo, double balan)acntNumber=acntNo;balance=balan;void Account:display()constcoutAccount:“ acntNumber = “ balancen;版权所有:沈阳航空航天大学面向对象程序设计及C+存款账户类定义存款账户类定义39/file Saving.h#ifndef SAVING_H#define SAVING_H#include Account.hcl

33、ass Savings : public Account /允许透支金额允许透支金额static double minBalance;public:Savings(string acntNo, double balan):Account(acntNo,balan)virtual void display()const;virtual void withdrawal(double );virtual Savings();#endif/file Savings.cpp#include Savings.hdouble Savings:minBalance =100;void Savings:disp

34、lay() constcoutSavings ;Account:display();void Savings:withdrawal( double amount)if(balance + minBalance amount)cout资金不足资金不足!: amountn;elsebalance-=amount;版权所有:沈阳航空航天大学面向对象程序设计及C+40 结算账户类定义/file Checking.cpp#include Checking.hChecking:Checking(string acntNo, double balan):Account(acntNo, balan)remit

35、tance=other;void Checking:display()constcoutChecking ;Account:display();void Checking:withdrawal(double amount)/信汇信汇30元手续费元手续费if(remittance=remitByPost)amount += 30;/电汇电汇60元手续费元手续费if(remittance=remitByCable)amount += 60;if(balance amount)cout 资金不足资金不足: amountacnt=new Savings(vno,vm);if (first=NULL)

36、first=pN;elsepN-next=first;first=pN;size+;版权所有:沈阳航空航天大学面向对象程序设计及C+43void AccountList:AddCheck(string vno,double vm)Node* pN=new Node;pN-acnt=new Checking(vno,vm);if (first=NULL) first=pN;elsepN-next=first;first=pN;size+;版权所有:沈阳航空航天大学面向对象程序设计及C+44void AccountList:AddCheck(string vno,double vm)Node* p

37、N=new Node;pN-acnt=new Checking(vno,vm);if (first=NULL) first=pN;elsepN-next=first;first=pN;size+;版权所有:沈阳航空航天大学面向对象程序设计及C+45void AccountList:AddCheck(string vno,double vm)Node* pN=new Node;pN-acnt=new Checking(vno,vm);if (first=NULL) first=pN;elsepN-next=first;first=pN;size+;版权所有:沈阳航空航天大学面向对象程序设计及C+

38、46/file Main.cpp#include AccountList.hvoid main()AccountList list;coutnext)if (pN-acnt)-GetNO()=acntNO) return (pN-acnt);return NULL;void AccountList:deposit(string vno,double vm)/存款存款Account* p=find(vno);if (p!= NULL) p-deposit(vm);版权所有:沈阳航空航天大学面向对象程序设计及C+48void AccountList:withdrawal(string vno,do

39、uble vm)/取款取款Account* p=find(vno);if (p!=NULL) Checking *pc=NULL;if (pc=dynamic_cast(p)!=0) /说明是存款账户说明是存款账户coutvno:你是结算帐户你是结算帐户,可以异地提款可以异地提款;int j=2; REMIT remit;coutj;if (j=0) remit=remitByPost;else if (j=1) remit=remitByCable;else if (j=2) remit=other;pc-setRemit(remit);p-withdrawal(vm);版权所有:沈阳航空航

40、天大学面向对象程序设计及C+49/file Main.cpp#include AccountList.hvoid main()AccountList list;cout开户操作开户操作:n;list.AddSave(Save3296,300);list.AddCheck(Check888,500);list.display();cout存款操作存款操作:n;list.deposit(Save3296,8000);list.deposit(Check888,3000);list.display();cout取款操作取款操作:n;list.withdrawal(Check888,1000);lis

41、t.withdrawal(Save3296,1000);list.display();版权所有:沈阳航空航天大学面向对象程序设计及C+50开户操作开户操作:There are 2 account.Checking Account:Check888 = 500Savings Account:Save3296 = 300存款操作存款操作:There are 2 account.Checking Account:Check888 = 3500Savings Account:Save3296 = 8300取款操作取款操作:Check888:你是结算帐户你是结算帐户,可以异地提款可以异地提款请选取款方式

42、请选取款方式(0=信汇信汇, 1=电汇电汇, 2=无无):1There are 2 account.Checking Account:Check888 = 2440Savings Account:Save3296 = 7300 手续费:信汇手续费:信汇=30 电汇电汇=60 其他其他=0版权所有:沈阳航空航天大学面向对象程序设计及C+利用文件保存数据,链表利用文件保存数据,链表-文件文件51文件流文件流C+文件流包括:文件输入流ifstream 和文件输出流ofstream,这两个文件流都定义在包含文件fstream.h中。C+进行文件操作的步骤: 创建流对象;建立流对象与文件的关联;读 /

43、写文件;关闭文件版权所有:沈阳航空航天大学面向对象程序设计及C+52 根据需要创建不同的流对象根据需要创建不同的流对象打开一个打开一个输入输入文件流文件流 必须说明类型为必须说明类型为 ifstream 的对象的对象打开一个打开一个输出输出文件流文件流必须说明类型为必须说明类型为ofstream 的对象的对象要建立要建立输入和输出输入和输出的文件流的文件流必须说明类型为必须说明类型为 fstream 的的对象对象例如:例如:ifstream in ;/ inputofstream out ;/ outputfstream both ;/ input and output版权所有:沈阳航空航天大

44、学面向对象程序设计及C+53 建立文件关联建立文件关联例如:例如: ofstream ofile ; / 创建输出文件流创建输出文件流 ofile . open ( “ myfile1” ) / 建立文件关联建立文件关联 ofile . close ( ) ; / 关闭文件关闭文件“myfile1” ofile . open ( “myfile2” ) / 重用重用ofile流流版权所有:沈阳航空航天大学面向对象程序设计及C+54 void open ( const char * , int mode , int = filebuf : openprot )其中,第一个参数表示相关联的文件名其中,第一个参数表示相关联的文件名第二个参数表示文件的打开方式第二个参数表示文件的打开方式第三个参数是文件的保护方式,一般只用缺省值第三个参数是文件的保护方式,一般只用缺省值 文件流的构造函数具有相同的参数和缺省值文件流的构造函数具有相同的参数和缺省值 构造函数和构造

温馨提示

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

评论

0/150

提交评论