C++ 语言程序设计

fjlyxx

贡献于2012-06-27

字数:0 关键词: C/C++开发 C/C++

东莞理工学院东莞理工学院 王静王静 C++语言程序设计 1.1从C到C++ C++语言发展历史 自从1946年第一台电子数字计算机ENIAC 问世以来,随着计算机应用领域的不断扩 大,促进了计算机技术的高速发展,尤其是 近年来计算机的硬件和软件都是日新月异。 作为应用计算机的一种工具—程序设计语 言,得到不断的充实和完善。每年都有新的 程序设计语言问世,老的程序设计语言不断 地更新换代。 20世纪60年代,Martin Richards为计算机软 件人员在开发系统软件时,作为记述语言使用而开 发了BCPL 语言(Basic Combined Programming Language)。1970年,Ken Thompson在继承BCPL语 言的许多优点的基础上发明了实用的B语言。到了 1972 年,贝尔实验室的Dennis Ritchie 和 Brian kernighan在B语言的基础上,作了进一步的充实和完 善,设计出了C语言。当时,设计C语言是为了编写 UNIX操作系统的。以后,C语言经过多次改进,并开始 流行。C++是在C语言的基础上发展和完善的,而C 是吸收了其它语言的优点逐步成为实用性很强的语 言。 C语言的主要特点: 2、它既有高级语言的特点,又具有汇编语 言的特点。运算符丰富,除了提供对数据的 算术逻辑运算外,还提供了二进制的位运 算。并且也提供了灵活的数据结构。用C语 言编写的程序表述灵活方便,功能强大。用 C语言开发的程序,其结构性好,目标程序 质量高,程序执行效率高。 1、C语言是一种结构化的程序设计语言, 语言本身简洁、使用灵活方便。既适用于 设计和编写大的系统程序,又适用于编写 小的控制程序,也适用科学计算。 3、程序的可移植性好。用C语言在某一种型号的计 算机上开发的程序,基本上可以不作修改,而直接 移植到其它型号和不同档次的计算机上运行。 4、程序的语法结构不够严密,程序设计的自由度 大。这对于比较精通C语言的程序设计者来说,可 以设计出高质量的非常通用的程序。但对于初学者 来说,要能比较熟练运用C语言来编写程序,并不 是一件容易的事情。与其它高级语言相比而言,调 试程序比较困难。往往是编好程序输入计算机后, 编译时容易通过,而在执行时还会出错。但只要对 C语言的语法规则真正领会,编写程序及调试程序 还是比较容易掌握的。 随着C语言应用的推广,C语言存在的一 些缺陷或不足也开始流露出来,并受到大家 的关注。如:C语言对数据类型检查的机制 比较弱;缺少支持代码重用的结构;随着软 件工程规模的扩大,难以适应开发特大型的 程度等等。 面向过程Æ设计细节Æ大型软件 为了克服C语言本身存在的缺点,并保持C语言 简洁、高效,与汇编语言接近的特点,1980年,贝 尔实验室的Bjarne Stroustrup博士及其同事对C语 言进行了改进和扩充,并把Simula 67中类的概念 引入到C中。并在1983年由Rick Maseitti提议正式 命名为C++(C Plus Plus)。后来,又把运算符的 重载、引用、虚函数等功能加入到C++中,使C++ 的功能日趋完善。 当前用得较为广泛的C++有:VC++ (Visual C Plus Plus)、 BC++(Borland C Plus Plus)、 AT&T C++等。 1.2简单的C++程序介绍 高级语言编译过程 源程序 (文本文件) *.CPP 目标文件 (二进制文件) *.OBJ 可执行文件 (二进制文件) *.EXE 库文件 (各种函数) 在Vitual C++系统中,可直接从源程序编译连接至可 执行程序,但依然要生成*.OBJ及*.EXE这两个文件。 F7 编译 连接 compile link 一个简单的C++程序 #include int main(void ) { cout<<“I am a student.\n”; //输出字符串 } 主函数 函数体 开始 函数体 结束 输出流,在屏幕上打 印引号内的字符串 分号,一条完整 语句的结束符 本程序编译执行后,在DOS屏幕上打印出 I am a student. 包含文件 注释 1)启动Visual C++,选择“文件”菜单中的“新 建”命令,选择“文件”标签中的“C++ Source File”选项。 2)选择源程序存放的目录和输入源程序名, 单击“确定”。 3)在编辑器中编写源程序。 4)单击F7或“编译”中的“重建全部”编译源程 序,若编译通过,单击“执行”,在DOS屏上看 结果,任按一键返回编辑器。 编译过程: 启动VC++ 编译系统 VC++编译 系统界面 单击“File”菜单 中“New”命令 选择“Files”选项卡 选择C++源 文件命令 输入文件名 输入文件 存放位置 单击选择 驱动器 选择驱动 器或目录 C++源文件 编辑界面 输入C++ 源代码 可以将此源 代码另起文 件名存盘 选择编译命令,将源文 件.cpp生成.obj文件 如果编译出错,会出现提示信 息,指出错误的位置及种类 错误所在行 错误的原因 双击错误 所在行 光标移到该行 生成可执 行文件 通过后单 击该命令 运行程序 运行结果显示 在DOS屏上 源程序所在目录 未编译前,只 有一个源程序 编译运行后,出 现众多附加文件 同时,产生一个 子目录Debug Debug目录中,有 obj和EXE文件 #include void main(void) { cout << “i=”; //显示提示符 int i; //说明变量i cin >>i; //从键盘上输入变量i的值 cout << “i的值为:” <> using namespace std;using namespace std; intint main()main() {{ intint a,b,suma,b,sum;; cincin>>a>>b;>>a>>b; sum=sum=a+ba+b;; coutcout<<"<<"a+ba+b="<> using namespace std;using namespace std; intint main()main() { { intint max(intx,intmax(intx,int y);y); intint a,b,ca,b,c;; cincin>>a>>b;>>a>>b; c=c=max(a,bmax(a,b);); coutcout<<"max="<y) z=x;>y) z=x; else z=y;else z=y; return(zreturn(z);});} 1.41.4 #include<#include> using namespace std;using namespace std; class Studentclass Student {private:{private: intint num;num; intint score;score; public:public: void void setdatasetdata()() { { cincin>>num;>>num; cincin>>score; }>>score; } void display()void display() { { coutcout<<"num="< #define doub1(x) x*2 inline int doub2(int x) {return x*2;} void main() { cout<< “1+2 double is”< int max(int a, int b) { return a>b?a,b; } void main() { int a,int b; cin>>a>>b; int M=max(a,b); cout< int add(int a, int b) { int c; c=a+b; return c; } void main() { int x,y ; cout<<"enter two number:"<<'\n'; //新的 I/0 流 cin>>x; cin>>y; int sum; //更自由的变量定义 sum=add(x,y); cout<。 2、通过键入字符'+'、 '-'、'*'或 '/'(分别表示加、减、乘或除运算符)响应程序的提示 command>, 能够支持加、减、乘、除运算。 3、当一个运算符输入后,程序便要求输入同当前值一起运算的第二个数。若给定了第二个 数,程序便执行指定的运算,显示新的当前值。 4、在程序提示 command>后可接受字符'C'作为清除当前值的命令,即将当前值设置为 0。 5、在程序提示 command>后可接受字符'Q'命令,终止程序的运行 下面给出一个运行实例: 计算器演示程序 ---- 在'>' 提示后输入一个命令字符 Value : 0 command>+↙ number>1.23↙ Value : 1.23 command>*↙ number>6.4↙ Value : 7.872 command>C↙ Value : 0 command> Q ↙ 键入'Q'后,程序运行终止。 课程课程 要求要求 课程课程 内容内容 课程课程 练习练习 参考参考 书目书目 面向对象程序设计 课程内容课程内容 课程要求 参考书目 返回首页 类和对象类和对象 构造函数和析构函数构造函数和析构函数 类和对象类和对象 C++C++中的结构体中的结构体 面向对象程序设计 C++C++中中的结构的结构** CC的结构体可以集成不同类型的数据的结构体可以集成不同类型的数据 prev next back structstruct complexcomplex {{ double real;double real; double image;double image; };}; structstruct bookbook {{ char *name;char *name; intint ISBN;ISBN; float money;float money; char *publish;char *publish; };}; 面向对象程序设计 C++C++中中的结构的结构 C++C++中的结构体中的结构体 prev next back 格式:格式:structstruct 变量名变量名 {{ private: private: 数据成员和成员函数数据成员和成员函数 public: public: 数据成员和成员函数数据成员和成员函数 }};; privateprivate::私有成员,只能被结构内其他成员访问私有成员,只能被结构内其他成员访问 public: public: 公有成员公有成员,,可以被结构外其他成员访问可以被结构外其他成员访问 面向对象程序设计 C++C++中中的结构的结构** prev next back ––privateprivate和和publicpublic是可以缺省的,此时结构体所是可以缺省的,此时结构体所 有成员为有成员为公有成员公有成员 ––结构体拥有信息隐藏和封装的特性,但却没结构体拥有信息隐藏和封装的特性,但却没 有继承、派生等面向对象属性有继承、派生等面向对象属性 11、、用结构体实现的复数计算用结构体实现的复数计算 面向对象程序设计 类和对象类和对象** 类的组成类的组成 数据成员的集合数据成员的集合 成员函数声明的集合成员函数声明的集合 可见性级别可见性级别 相关的标记名相关的标记名 prev next back 类接口:类接口: 抽象数据类型:抽象数据类型: 面向对象程序设计 类和对象类和对象 类的定义类的定义 格式:格式: prev next back classclass 变量名变量名 {{ private: private: 数据成员和成员函数数据成员和成员函数 protected: protected: 数据成员和成员函数数据成员和成员函数 public: public: 数据成员和成员函数数据成员和成员函数 }};; 面向对象程序设计 类和对象类和对象 类的定义类的定义 prev next back ––访问权限控制符的位置可以任意,也可以缺省,访问权限控制符的位置可以任意,也可以缺省, 缺省时认为是缺省时认为是私有部分私有部分 ––对访问权限控制符的说明对访问权限控制符的说明 ––private:private:只能被类本身成员访问只能被类本身成员访问 ––public:public:类对外结构,可以被类本身和类外成类对外结构,可以被类本身和类外成 员访问员访问 ––protected: protected: 可以被类本身成员或子类可以被类本身成员或子类 调用调用 私有的成员与公有的成员的先后次序无关紧要私有的成员与公有的成员的先后次序无关紧要 不过公有的接口函数放在前面更好不过公有的接口函数放在前面更好 面向对象程序设计 类和对象类和对象 类的数据成员类的数据成员 与普通变量定义一样,但不允许显示的与普通变量定义一样,但不允许显示的 初始化初始化 prev next back class Personclass Person { { intint height=0;height=0; intint weight;weight; char *name;char *name; }} 面向对象程序设计 类和对象类和对象 类的数据成员类的数据成员 把类对象声明为数据成员,可以使用类把类对象声明为数据成员,可以使用类 的前向说明的前向说明 prev next back class Man;class Man; class Womanclass Woman { { char *name;char *name; Man *husband;Man *husband; };}; class Manclass Man {{………… }} 面向对象程序设计 类和对象类和对象 类的数据成员类的数据成员 允许一个类定义将指向自己的指针和对允许一个类定义将指向自己的指针和对 自己的引用作为数据成员自己的引用作为数据成员 prev next back class class LinkPersonLinkPerson {{ Person me;Person me; LinkPersonLinkPerson *next;*next; LinkPersonLinkPerson **prevprev;; }} 面向对象程序设计 类和对象类和对象 类的成员函数类的成员函数 声明:在类体内声明,与普通函数声明声明:在类体内声明,与普通函数声明 类似类似 prev next back ––范例范例11:日期类的定义:日期类的定义 ––范例范例22:复数类的定义:复数类的定义 ––范例范例33:点类的定义:点类的定义 面向对象程序设计 类和对象类和对象 类成员函数的定义类成员函数的定义 类内定义类内定义 类外定义类外定义 prev next back 返回类型返回类型 类名类名::::函数名(参数表)函数名(参数表) 11、、CDateCDate类成员定义类成员定义 22、、复数类成员定义复数类成员定义 面向对象程序设计 类和对象类和对象 类对象的说明类对象的说明 声明类的同时说明对象声明类的同时说明对象 在使用时说明在使用时说明 prev next back class class myclassmyclass { { …………} obj1,obj2;} obj1,obj2; void main()void main() {{ myclassmyclass obj3, *obj4;obj3, *obj4; }} 面向对象程序设计 类和对象类和对象 类对象的调用类对象的调用 调用形式调用形式 prev next back 对象名对象名..成员名成员名 ////普通变量的调用普通变量的调用 对象名→成员名对象名→成员名 ////对象指针的调用对象指针的调用 class sampleclass sample { { intint x;x; public: void public: void set_a(intset_a(int a) { x=a;} };a) { x=a;} }; void main()void main() { sample a,*b;{ sample a,*b; a.set_a(2); a.set_a(2); bb-->set_a(3);>set_a(3); }} 面向对象程序设计 类和对象类和对象 prev next back 字符串倒序(栈类实现)字符串倒序(栈类实现) 11、私有数据、私有数据 22、外部接口、外部接口 33、、完整程序段完整程序段 栈顶指针栈顶指针 初始化初始化 入栈入栈 出栈出栈 线段类的实现线段类的实现 11、私有数据、私有数据 22、外部接口、外部接口 33、、完整程序段完整程序段 线段端点线段端点 设置端点位置设置端点位置 报告线段位置报告线段位置 线段长度获取线段长度获取 面向对象程序设计 类和对象类和对象 类定义的指导原则:类定义的指导原则: 把数据成员声明为把数据成员声明为私有私有的成员的成员 把仅由本类使用的服务声明为把仅由本类使用的服务声明为私有私有成员成员 把可以为其他对象使用的方法声明为把可以为其他对象使用的方法声明为公公 共共成员成员 不要把与实现相关的成员函数置为公共不要把与实现相关的成员函数置为公共 的。的。 一个类的每个成员函数都应该能够修改一个类的每个成员函数都应该能够修改 本类的数据成员,或对本类的数据成员本类的数据成员,或对本类的数据成员 提供访问提供访问 prev next back 面向对象程序设计 类和对象类和对象 类定义的指导原则:类定义的指导原则: 如果要求变量和方法对子类是可访问如果要求变量和方法对子类是可访问 的,就将其声明为的,就将其声明为保护成员保护成员 一个类应该尽可能少的依赖于其他类一个类应该尽可能少的依赖于其他类 (低耦合)(低耦合) 类不应该使用全局变量进行通信类不应该使用全局变量进行通信 类之间交互的信息尽量少,使用指针和类之间交互的信息尽量少,使用指针和 引用进行调用是有益的。引用进行调用是有益的。 prev next back 面向对象程序设计 类和对象类和对象 类定义的指导原则:类定义的指导原则: 通常,把类中的声明部分和实现部分应通常,把类中的声明部分和实现部分应 该分离,一般来说类定义放在该分离,一般来说类定义放在..hh的文件的文件 中,而实现可以在中,而实现可以在CPPCPP文件中文件中 prev next back 头文件中:头文件中: 11、所有的、所有的includeinclude文件文件 22、所有的、所有的typedeftypedef 33、、所有的前向说明所有的前向说明 44、类的定义(关键字、成员声明)、类的定义(关键字、成员声明) 范例范例11::类声明和成员函数定义的分离类声明和成员函数定义的分离.. 范例范例2:2:windowswindows类定义类定义 东莞理工学院教案 课程名称:《面向对象程序设计》 第 2 章 37-67 授课对象: 计算机专业 07 级 上课时间: 2008 年 3 月 授 课 人: 王静 授课形式: 理论课 教 案 内 容 一、教学目的: 1、了解堆内存的概念,掌握 new 和 delete 的使用 2、掌握 c++中有关引用的知识 3、C++中的结构体与 C 中结构体的区别 3、掌握类的定义和使用 4、理解 this 指针的作用 二、教学重点和难点 重点:new 和 delete、引用、结构体、类的定义、this 指针 难点:引用、类的定义、this 指针 三、教学内容要点: 1、new 和 delete 在内存分配的作用 2、掌握引用定义的格式,了解引用的实际是建立变量的别名。掌握引用作为函数参数 的使用方法,掌握引用作为函数返回值的用法。 3、结构体 结构体在 C++中的定义 包含数据成员和成员函数 成员有私有成员和公有成员的区分,默认情况下是公有成员 提示学生注意,结构体在 C++中是一个对象,而在 C 中只是数据的集合体。 4、类 1)类的定义: 类的头:class 变量名 类体: { }; 类体中包含数据成员和成员函数的定义,成员有私有、公有和保护之分 了解各个访问控制权限的区别,并注意缺省时,成员属于私有成员 2)类的数据成员定义 3)类成员函数的定义 可以在类内,也可以在类外进行 在类外进行时须注意其说明格式 4)类定义的指导性原则 让学生了解在类中,什么成员应该定义为私有、公有或保护的 使学生了解类定义和实现应该分离,或放在不同文件中,在同一文件中,函数实 现应在类外 5)类对象的说明 6)类对象调用类成员的方法:注意区分指针对象和普通对象调用的方式 7)类中的 this 指针 this 是一个隐含指针,指向当前的实例对象 可以显示使用 this 指针 file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/悬挂.txt CA(char *s) { if(s.ps) { ps=new char[strlen(s)+1]; strcpy(ps,s); } else ps=0; } file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/悬挂.txt2009-5-21 21:36:39 #include void main() { int i; int &j=i; i=30; cout<<"i="< const int max=100; class set { int list[max]; int pc; public: set() { pc=0; cout<<"a empty set construct!"<=100) pc=100; else pc=size; for (int i=0;imax) { cout<<"The set is full"<0) cout< #define doub1(x) x*2 inline int doub2(int x) {return x*2;} void main() { cout<< “1+2 double is”< #include #include class CLine { public: void setline(int a1,int a2,int b1,int b2) { x1=a1; y1=a2; x2=b1; y2=b2;} void drawline(); float getlength(); private: int x1,y1,x2,y2; }line1; void CLine::drawline() { printf(" 线段的位置是: (%d,%d),(%d,%d)\n",x1,y1,x2,y2); } float CLine::getlength() { float temp; temp=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return temp;} void main() { line1.setline(1,3,4,5); line1.drawline(); cout<<"线段的长度是:"<setline(2,4,5,8); line2->drawline(); cout<<"线段的长度是:"<getlength()< #include #include class CLine { private: int x1,y1,x2,y2; public: void setline(int a1,int a2,int b1,int b2) { x1=a1; y1=a2; x2=b1; y2=b2;} void drawline(); float getlength(); }line1; void CLine::drawpoint() { printf("线段的位置是:(%d,%d),(%d,%d)\n",x1,y1,x2,y2); } float getlength() { float temp; temp=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return temp; } void main() { line1.setline(1,3,4,5); line1.drawline(); cout<<"线段的长度是:"<setline(2,4,5,8); line2->drawline(); cout<<"线段的长度是:"<getlength()< int max(int a, int b) { return (a>b?a:b); } void main() { int a,b,c,d; cin>>a>>b; int M=max(a,b); cout< struct stacknode { char data; stacknode *next; }; class stack { public: void init() { topnode=NULL; } void push(char k); char pop(); stacknode *topnode; }; void stack::push(char k) { stacknode *node=new stacknode; node->data=k; node->next=topnode; topnode=node; } char stack::pop() { char value; stacknode *t; value=topnode->data; t=topnode; topnode=topnode->next; delete t; return value; } void main() { stack A; int n; A.init(); cout<<"请输入字符个数 N"; cin>>n; char *str=new char[n]; cout<<"请输入 N 个字符:"<>str[i]; A.push(str[i]); } cout< struct stacknode { char data; stacknode *next; }; class stack { stacknode *topnode; public: void init() { topnode=NULL; } void push(char k); char pop(); }; void stack::push(char k) { stacknode *node=new stacknode; node->data=k; node->next=topnode; topnode=node; } char stack::pop() { char value; stacknode *t; value=topnode->data; t=topnode; topnode=topnode->next; delete t; return value; } void main() { stack A; int n; A.init(); cout<<"请输入字符个数N"; cin>>n; file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/stack.txt(第 1/2 页)2009-5-21 21:37:28 file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/stack.txt char *str=new char[n]; cout<<"请输入N个字符:"<>str[i]; A.push(str[i]); } cout< #include class student { public: student(char *pName="no name", int ssId=0) { id=ssId; name=new char[strlen(pName)+1]; strcpy(name,pName); cout<<"construct new student "< #include class student { public: student(char *pName="no name",int ssId=0) { id=ssId; name=new char[strlen(pName)+1]; strcpy(name,pName); cout<<"construct new student"< #include #include typedef float length; class shape; class LinkScreen; class Window { public: void add_box(length x,length y,length w, length h); void move(length deltax, length deltay); private: length xmin,ymin,xmax,ymax; void add_to_selection (shape *sh); }; class CDate { private: int year, month, day; public: void SetDate(int y,int m, int n); void GetDate(); void init(); }; class complex { private : double real, imag; public: void init(); double getreal(); double getimag(); double abscomplex(); }; class CPoint { private: int x,y; public: void GetXY(); void SetXY(int a, int b); }; class CLine { private: CPoint L1,L2; public: void GetLen(); } file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/构造函数1.txt class CPoint { private int x,y; public: CPoint() { x=0; y=0;} void move(int a,int b) { x=a; y=b;} void draw() {cout<<"当前位置是:"< int sum (int x, int y) { return x+y; } int sum( float x, float y) { return x+y;} void main() { cout< #include #include class calculator { double a,b; public: calculator(){a=0;b=0;} void newa() { double num; cout<<"input the number:"; cin>>num; a=num; } void newab() { double num1,num2; cout<<"input the first number:"; cin>>num1; cout<<"input the second number:"; cin>>num2; a=num1; b=num2; } double Add(calculator &A); double Sub(calculator &A); double Sin(calculator &A); }; double calculator::Add(calculator &A) { return A.a+A.b; } double calculator::Sub(calculator &A) { return A.a-A.b; } double calculator::Sin(calculator &A) { return sin(A.a); } file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/计算器.txt(第 1/2 页)2009-5-21 21:38:32 file:///F|/工作/面向对象程序设计-王静/王静课件/2类和对象/计算器.txt void main() { int sel; calculator cal; cout<<"welcome to use the calculator!please select."<>sel; switch (sel) { case 0:break; case 1:cal.newab(); cout<<"the result is:"< #include struct complex { private: double real, imag; public: void init(double r, double i) { real=r; imag=i; } double realcomplex() { return real; } double imagcomplex() { return imag; } double abscomplex() { double t; t=real*real+imag*imag; return sqrt(t); } }; void main() { complex a; a. init(1,3); cout< #include struct complex { private: double real,imag; public: void init(double r, double i) { real=r; imag=i; } double realcomplex() { return real; } double imagcomplex() { return imag; } double abscomplex() { double t; t=real*real+imag*imag; return sqrt(t); } }; void main() { complex a; a.init(1,3); cout< int trans(int n,int base) { int t1,t2,temp=0; t1=n; int i=1; do { t2=t1%base; temp=t2*i+temp; t1=t1/base; i=i*10; }while (t1!=0); return temp; } void main() { cout< #include"student.h" void student::display() {cout<<"num:"< #include"student.h" int main() {student stud; stud.display(); return 0;} 课程课程 要求要求 课程课程 内容内容 课程课程 练习练习 参考参考 书目书目 面向对象程序设计 课程内容课程内容 课程要求 参考书目 返回首页 构造函数构造函数 类和对象类和对象 面向对象程序设计 类和对象类和对象 类的定义类的定义 格式:格式: prev next back classclass 变量名变量名 {{ private: private: 数据成员和成员函数数据成员和成员函数 protected: protected: 数据成员和成员函数数据成员和成员函数 public: public: 数据成员和成员函数数据成员和成员函数 }};; 面向对象程序设计 类和对象类和对象 类的成员函数类的成员函数 声明:在类体内声明,与普通函数声明声明:在类体内声明,与普通函数声明 类似类似 prev next back ––范例范例11:日期类的定义:日期类的定义 ––范例范例22:复数类的定义:复数类的定义 ––范例范例33:点类的定义:点类的定义 面向对象程序设计 类和对象类和对象 类成员函数的定义类成员函数的定义 类内定义类内定义 类外定义类外定义 prev next back 返回类型返回类型 类名类名::::函数名(参数表)函数名(参数表) 11、、CDateCDate类成员定义类成员定义 22、、复数类成员定义复数类成员定义 面向对象程序设计 类和对象类和对象 类对象的说明类对象的说明 声明类的同时说明对象声明类的同时说明对象 在使用时说明在使用时说明 prev next back class class myclassmyclass { { …………} obj1,obj2;} obj1,obj2; void main()void main() {{ myclassmyclass obj3, *obj4;obj3, *obj4; }} 关于内存分配关于内存分配 面向对象程序设计 类和对象类和对象 类对象的调用类对象的调用 调用形式调用形式 prev next back 对象名对象名..成员名成员名 ////普通变量的调用普通变量的调用 对象名→成员名对象名→成员名 ////对象指针的调用对象指针的调用 class sampleclass sample { { intint x;x; public: void public: void set_a(intset_a(int a) { x=a;} };a) { x=a;} }; void main()void main() { sample a,*b; b=&a;{ sample a,*b; b=&a; a.set_a(2); a.set_a(2); bb-->set_a(3);>set_a(3); }} 面向对象程序设计 不同对象占据内存中的不同区域,它不同对象占据内存中的不同区域,它 们所保存的数据各不相同,但对成员们所保存的数据各不相同,但对成员 数据进行操作的成员函数的程序代码数据进行操作的成员函数的程序代码 均是一样的。均是一样的。 面向对象程序设计 类和对象类和对象 成员函数的重载成员函数的重载 定义:同一个函数名可以有多个函数实定义:同一个函数名可以有多个函数实 现现 进行函数调用时根据函数名和函数参数进行函数调用时根据函数名和函数参数 来决定调用的函数来决定调用的函数 实现函数名重载的条件实现函数名重载的条件 参数的个数不同参数的个数不同 参数的类型不同参数的类型不同 prev next back –– 范例范例 面向对象程序设计 类和对象类和对象 类定义的指导原则:类定义的指导原则: 通常,把类中的声明部分和实现部分应通常,把类中的声明部分和实现部分应 该分离,一般来说类定义放在该分离,一般来说类定义放在..hh的文件的文件 中,而实现可以在中,而实现可以在CPPCPP文件中文件中 prev next back 头文件中:头文件中: 11、所有的、所有的includeinclude文件文件 22、所有的、所有的typedeftypedef 33、、所有的前向说明所有的前向说明 44、类的定义(关键字、成员声明)、类的定义(关键字、成员声明) 范例范例11::声明实现分离声明实现分离 范例范例22::windowswindows类定义类定义 面向对象程序设计 类和对象类和对象** ThisThis指针指针 指向当前对象实例的特殊指针指向当前对象实例的特殊指针 成员函数通过成员函数通过thisthis指针,找到自己所属的指针,找到自己所属的 对象实例对象实例 隐含定义形式隐含定义形式 prev next back <<类名类名> *> *const this;const this; 类中隐含的类中隐含的thisthis指针指针 对象资源的拷贝对象资源的拷贝 面向对象程序设计 对象的初始化对象的初始化 类的数据成员类的数据成员 与普通变量定义一样,但不允许显示的与普通变量定义一样,但不允许显示的 初始化初始化 prev next back class Personclass Person { { intint height=0;height=0; intint weight;weight; char *name;char *name; }} 面向对象程序设计 构造函数和析构函数构造函数和析构函数** 构造函数构造函数 特殊的类成员函数特殊的类成员函数 主要用于对象空间的分配以及初始化主要用于对象空间的分配以及初始化 定义形式定义形式 prev next back 类名(参数表)类名(参数表) class sampleclass sample { { intint x;x; public: public: sample( ) { x=0;}sample( ) { x=0;} sample( sample( intint a) { x=a;}a) { x=a;} };}; 面向对象程序设计 构造函数和析构函数构造函数和析构函数 prev next back 函数名必须与类同名函数名必须与类同名 参数可以有,也可以缺省参数可以有,也可以缺省 函数不能有返回类型函数不能有返回类型 定义对象时,系统将定义对象时,系统将自动调用自动调用构造函数构造函数 构造函数可以有多个构造函数可以有多个 构造函数构造函数 课本范例:课本范例:3.13.1 构造函数的重载构造函数的重载 面向对象程序设计 构造函数和析构函数构造函数和析构函数 prev next back class Personclass Person { public: { public: Person(charPerson(char inputSexinputSex);//);//初始化初始化sexsex Person(intPerson(int inputAgeinputAge);//);//初始化初始化ageage Person(charPerson(char **input_nameinput_name);//);//初始化初始化namename private: char sex; private: char sex; intint age; char *name;age; char *name; };}; 重载普遍的用做提供一组可选的初始化工具重载普遍的用做提供一组可选的初始化工具 面向对象程序设计 构造函数和析构函数构造函数和析构函数 prev next back class Personclass Person { public: { public: Person(charPerson(char **input_nameinput_name,, char char inputSexinputSex,, intint inputAgeinputAge);); private: char sex; private: char sex; intint age; char *name;age; char *name; };}; 在构造函数中初始化所有成员数据是明智的在构造函数中初始化所有成员数据是明智的 在大多数情况下,最好能提供参数缺省值在大多数情况下,最好能提供参数缺省值 面向对象程序设计 构造函数和析构函数构造函数和析构函数 默认构造函数默认构造函数 隐含形式隐含形式 避免下面错误的产生避免下面错误的产生 prev next back 类名类名::::类名()类名(){ }{ } 一旦存在自定义构造函数,则系统不会再创建一旦存在自定义构造函数,则系统不会再创建 默认构造函数默认构造函数 class sampleclass sample { { intint x;x; public: sample ( public: sample ( intint a) {x=a;}a) {x=a;} }} void main()void main() { { sample a;sample a; }} 面向对象程序设计 构造函数和析构函数构造函数和析构函数 具有默认参数值的构造函数具有默认参数值的构造函数 prev next back class class CPointCPoint { { intint x,y,colorx,y,color;; public: public: CPointCPoint () { x=0; y=0; color=0;}() { x=0; y=0; color=0;} CPointCPoint ( ( intint a; a; intint b;intb;int c=0;) c=0;) { x=a; y=b; color=c;} { x=a; y=b; color=c;} void main()void main() { { CPointCPoint A( 1,1,2);A( 1,1,2); CPointCPoint B(1,1); B(1,1); }} 面向对象程序设计 构造函数和析构函数构造函数和析构函数 具有默认参数值的构造函数具有默认参数值的构造函数 prev next back 前面的前面的PersonPerson类构造函数:类构造函数: Person(charPerson(char **n,charn,char s=s=‘‘UU’’,int,int a=a=--1); 1); void main()void main() { { Person Baby1(Person Baby1(““undecidedundecided””);); Person Baby2(Person Baby2(““SusanSusan””, , ‘‘FF’’);); Person Person Bill(Bill(““BillBill””, , ‘‘ MM’’,35);,35); }} 注意使用默认参数函数的二义性问题注意使用默认参数函数的二义性问题 面向对象程序设计 用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化 C++C++还提供了另外一种初始化数据成还提供了另外一种初始化数据成 员的方法员的方法————用参数初始化表对数据用参数初始化表对数据 成员初始化成员初始化 范例范例11::3.33.3 范例范例22::3.43.4 东莞理工学院教案 课程名称:《面向对象程序设计》 内容:(69~112 页) 授课形式: 理论课 上课时间: 2008 年 3 月 25 日 授 课 人: 王静 授课对象: 计算机专业 07 级 教 案 内 容 一、教学目的: 1、掌握类对象的说明形式以及对象成员的调用方法 2、了解类的 this 指针的作用 3、掌握类构造函数的定义形式以及使用 二、教学重点和难点 重点:类对象的说明、类成员的调用、类构造函数 三、教学内容要点: 1.类对象的说明以及成员调用 1)类对象说明:可以在定义类同时说明对象,也可以在需要的时候,在程 序中自由定义 2) 成员的调用:注意区分普通类对象和指针对象对成员的调用符号。前者 使用的是,而后者使用的是->。 注意:私有的数据成员是不能直接调用的,而必须通过成员函数来调用。 2.类的构造函数 1)构造函数的定义形式。 定义时需注意:构造函数与类同名 构造函数与普通函数一样,可以有零个或多个参数 构造函数允许重载,所以在类中可以包含多个构造函数 构造函数不能有返回值,也不允许 void 作为其返回值 另一个需学生注意的是:构造函数是类对象说明时自动调用的,起到初 1 始化数据成员的作用,任何显式的调用都是错 误的。 2)知道默认构造函数的存在,以及明确默认构造函数在何时起作用。(系统 存在着默认的构造函数,只有在没有自定义构造函数时才由系统自动调用)。 3)具有默认参数值的构造函数的形式 2 #include using namespace std; class Time {public: Time() {hour=0; minute=0; sec=0; } void set_time(); void show_time(); private: int hour; int minute; int sec;}; void Time::set_time() { cin>>hour; cin>>minute; cin>>sec; } void Time::show_time() { cout< using namespace std; class Box {public: Box(); Box(int h,int w,int len):height(h),width(w),length(len){}; int volume(); private: int height; int width; int length; }; Box::Box() { height=10; width=10; length=10;} int Box::volume() { return height*width*length;} int main() { Box box1; cout<<"The volume of box1 is"< using namespace std; class Box {public: Box(int h=10,int w=10,int len=10); int volume(); private: int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len;} int Box::volume() { return height*width*length;} int main() { Box box1; cout<<"The volume of box1 is"< class complex { float a,b; public: complex() {a=0;b=0;} complex(float i,float j ) { a=i;b=j;} friend complex Add(complex &comp1, complex &comp2); friend complex Sub(complex &comp1,complex &comp2); friend void disp(complex &comp1); }; complex Add(complex &comp1,complex &comp2) { float x=comp1.a+comp2.a; float y=comp1.b+comp2.b; return complex(x,y); } void disp(complex &comp1) { if (comp1.b>0) cout< #include class CCourse; class CStudent { int number; char name[10]; int course[3]; public: CStudent() void Get_Info() friend void Show_Info(CStudent[] ,CCourse[] ); }; class CCourse { int code; char coursename[10]; public: CCourse(){ code=0; strcpy(coursename,"no");} void Get_Info() friend void Show_Info(CStudent [] ,CCourse [] ); }; void Show_Info(CStudent s[],CCourse c[]) { cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"选修课程 A"<<'\t'<<"选修课程 B"<<'\t'<<"选修课程 C"< #include #include class CLine { public: void setline(int a1,int a2,int b1,int b2) { x1=a1; y1=a2; x2=b1; y2=b2;} void drawline(); float getlength(); private: int x1,y1,x2,y2; }line1; void CLine::drawline() { printf(" 线段的位置是: (%d,%d),(%d,%d)\n",x1,y1,x2,y2); } float CLine::getlength() { float temp; temp=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return temp;} void main() { line1.setline(1,3,4,5); line1.drawline(); cout<<"线段的长度是:"<setline(2,4,5,8); line2->drawline(); cout<<"线段的长度是:"<getlength()< struct stacknode { char data; stacknode *next; }; class stack { public: void init() { topnode=NULL; } void push(char k); char pop(); stacknode *topnode; }; void stack::push(char k) { stacknode *node=new stacknode; node->data=k; node->next=topnode; topnode=node; } char stack::pop() { char value; stacknode *t; value=topnode->data; t=topnode; topnode=topnode->next; delete t; return value; } void main() { stack A; int n; A.init(); cout<<"请输入字符个数 N"; cin>>n; char *str=new char[n]; cout<<"请输入 N 个字符:"<>str[i]; A.push(str[i]); } cout< i=val;} int get(eg_this *this) { return this->i;} }; void main() { eg_this obj; obj.load(100);// load(&obj,100); cout< #include void main() { student a ("tom",23),b ("hojr",34); a.disp(); b.disp(); a.copy(a); b.copy(a); a.disp(); b.disp(); } class student {public: student(char *pName="no name", int ssId=0) { id=ssId; name=new char[strlen(pName)+1]; strcpy(name,pName); cout<<"construct new student "< #include #include typedef float length; class shape; class LinkScreen; class Window { public: void add_box(length x,length y,length w, length h); void move(length deltax, length deltay); private: length xmin,ymin,xmax,ymax; void add_to_selection (shape *sh); }; class CDate { private: int year, month, day; public: void SetDate(int y,int m, int n); void GetDate(); void init(); }; class complex { private : double real, imag; public: void init(); double getreal(); double getimag(); double abscomplex(); }; class CPoint { private: int x,y; public: void GetXY(); void SetXY(int a, int b); }; class CLine { private: CPoint L1,L2; public: double GetLen(); } class CPoint { private int x,y; public: CPoint() { x=0; y=0;} void move(int a,int b) { x=a; y=b;} void draw() {cout<<" 当前位置是: "< int sum (int x, int y) { return x+y; } float sum( float x, float y) { return x+y;} void main() { cout< #include #include class calculator { double a,b; public: calculator(){a=0;b=0;} void newa() { double num; cout<<"input the number:"; cin>>num; a=num; } void newab() { double num1,num2; cout<<"input the first number:"; cin>>num1; cout<<"input the second number:"; cin>>num2; a=num1; b=num2; } double Add(calculator &A); double Sub(calculator &A); double Sin(calculator &A); }; double calculator::Add(calculator &A) { return A.a+A.b; } double calculator::Sub(calculator &A) { return A.a-A.b; } double calculator::Sin(calculator &A) { return sin(A.a); } void main() { int sel; calculator cal; cout<<"welcome to use the calculator!please select."<>sel; switch (sel) { case 0:break; case 1:cal.newab(); cout<<"the result is:"< #include struct complex { private: double real, imag; public: void init(double r, double i) { real=r; imag=i; } double realcomplex() { return real; } double imagcomplex() { return imag; } double abscomplex() { double t; t=real*real+imag*imag; return sqrt(t); } }; void main() { complex a; a.init(1,3); cout< #include"student.h" void student::display() {cout<<"num:"< #include"student.h" int main() {student stud; stud.display(); return 0;} 课程课程 要求要求 课程课程 内容内容 课程课程 练习练习 参考参考 书目书目 面向对象程序设计 课程内容课程内容 课程要求 参考书目 返回首页 构造函数和析构函数构造函数和析构函数 类和对象类和对象 类的类的ConstConst成员成员 面向对象程序设计 构造函数和析构函数构造函数和析构函数** 构造函数构造函数 主要用于对象空间的分配以及初始化主要用于对象空间的分配以及初始化 与类名的类成员函数与类名的类成员函数 无返回值,不可加上显示返回无返回值,不可加上显示返回 可以有多个参数,允许存在重载可以有多个参数,允许存在重载 自动执行自动执行 定义形式定义形式 prev next back 类名(参数表)类名(参数表) 定义类对象时调用构造函数定义类对象时调用构造函数 使用使用newnew创建对象并分配空间时调用创建对象并分配空间时调用 面向对象程序设计 构造函数和析构函数构造函数和析构函数 默认构造函数默认构造函数 隐含形式隐含形式 避免下面错误的产生避免下面错误的产生 prev next back 类名类名::::类名()类名(){ }{ } 一旦存在自定义构造函数,则系统不会再创建一旦存在自定义构造函数,则系统不会再创建 默认构造函数默认构造函数 class sampleclass sample { { intint x;x; public: sample ( public: sample ( intint a) {x=a;}a) {x=a;} }} void main()void main() { { sample a;sample a; }} 面向对象程序设计 构造函数和析构函数构造函数和析构函数 具有默认参数值的构造函数具有默认参数值的构造函数 prev next back class class CPointCPoint { { intint x,y;x,y; public: public: CPointCPoint ( ( intint a =0a =0,,int b=0) int b=0) { x=a; y=b;} { x=a; y=b;} void main()void main() { { CPointCPoint A( 1,1);A( 1,1); CPointCPoint B(1)B(1),,CC;; }} 面向对象程序设计 构造函数和析构函数构造函数和析构函数 prev next back 复数类复数类 计时器计时器 面向对象程序设计 构造函数和析构函数构造函数和析构函数 拷贝构造函数拷贝构造函数 将一个同类对象的值拷贝给一个新对将一个同类对象的值拷贝给一个新对 象,完成象,完成新新对象的初始化对象的初始化 定义形式定义形式 prev next back 类名(类名类名(类名 &&对象名)对象名) 只有一个参数,该参数是对该类对象的引用只有一个参数,该参数是对该类对象的引用 不定义拷贝构造函数,系统调用默认拷贝构不定义拷贝构造函数,系统调用默认拷贝构 造函数造函数 面向对象程序设计 构造函数和析构函数构造函数和析构函数 缺省的拷贝构造函数缺省的拷贝构造函数 prev next back class class CPointCPoint { { intint x,y;x,y; public: public: CPointCPoint( ) {x=0; y=0;}( ) {x=0; y=0;} CPoint(intCPoint(int vxvx, , intint vyvy)) { x={ x=vxvx; y=; y=vyvy;};} void print() {void print() {coutcout< class A {private: int i; public: A(int a) { i=a; cout<<"i="< class CCircle { private: int r; public: CCircle(int a) {r=a;} void print() { cout<<"radius:"<print(); delete c2; cout<<"main end"< class A { int x,y; public: A(){}; A(int a,int b) { x=a;y=b;cout<<"A construct"< class watch { public: watch(){start=clock();} ~watch(); private: clock_t start; }; watch::~watch() { clock_t total=clock()-start; cout<<"消耗的时间为:"< class complex { float a,b; public: complex() {a=0;b=0;} complex(float i,float j ) { a=i;b=j;} void disp(); }; void complex::disp() { if (b>0) cout< #include #include class CLine { public: void setline(int a1,int a2,int b1,int b2) { x1=a1; y1=a2; x2=b1; y2=b2;} void drawline(); float getlength(); private: int x1,y1,x2,y2; }line1; void CLine::drawline() { printf("线段的位置是:(%d,%d),(%d,%d)\n",x1,y1,x2,y2); } float CLine::getlength() { float temp; temp=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return temp;} void main() { line1.setline(1,3,4,5); line1.drawline(); cout<<"线段的长度是:"<setline(2,4,5,8); line2->drawline(); cout<<"线段的长度是:"<getlength()< #include class timer { int seconds; public: timer(int t=0) {seconds=t;} timer(char *t) { seconds=atoi(t);} timer(int min,int sec) { seconds=min*60+sec; } gettime() { return seconds; } }; void main() { timer a, b(10),c("20"),d(1,10); cout<<"seconds1="< #include #include class calculator { double a,b; public: calculator(){a=0;b=0;} void newa() { double num; cout<<"input the number:"; cin>>num; a=num; } void newab() { double num1,num2; cout<<"input the first number:"; cin>>num1; cout<<"input the second number:"; cin>>num2; a=num1; b=num2; } double Add(calculator A); double Sub(calculator A); double Sin(calculator A); }; double calculator::Add(calculator A) { return A.a+A.b; } double calculator::Sub(calculator A) { return A.a-A.b; } double calculator::Sin(calculator A) { return sin(A.a); } void main() { int sel; calculator cal; cout<<"welcome to use the calculator!please select."<>sel; switch (sel) { case 0:break; case 1:cal.newab(); cout<<"the result is:"< class TPoint { public: TPoint(int x,int y) {X=x; Y=y;} TPoint(TPoint &p); int Xcoord() {return X;}; int Ycoord() {return Y;}; private: int X,Y; }; TPoint::TPoint(TPoint &p) { X=p.X; Y=p.Y; cout<<"copy function"< const int max=100; class set { int list[max]; int pc;//集合元素个数 public: set() { pc=0; cout<<"a empty set construct!"<=100) pc=100; else pc=size; for (int i=0;imax) { cout<<"The set is full"<0) cout<。 注意:私有的数据成员是不能直接调用的,而必须通过成员函数来调 用。 2.类的构造函数 1)构造函数的定义形式。 定义时需注意:构造函数与类同名 构造函数与普通函数一样,可以有零个或多个参数 构造函数允许重载,所以在类中可以包含多个构造函数 构造函数不能有返回值,也不允许 void 作为其返回值 另一个需学生注意的是:构造函数是类对象说明时自动调用的,起到初始化数据成 员的作用,任何显式的调用都是错误的。 。 2)知道默认构造函数的存在,以及明确默认构造函数在何时起作用。(系统存在着默认 的构造函数,只有在没有自定义构造函数时才由系统自动调用)。 3)具有默认参数值的构造函数的形式 4)拷贝初始化构造函数 了解其定义形式,知道其作用是用同类的对象去初始化新的类对象。 拷贝构造函数的三个常用用途:初始化新对象时调用,对象作为函数形参进行值传 递时调用,以及对象作为函数返回值时调用 5)构造函数在强制类型转换方面的使用 3.类的析构函数 1)定义形式 定义时注意:与类同名,前面带有~符号 没有返回值 没有参数 析构函数只能有一个 另外要注意的是:析构函数在对象撤消时自动调用,不允许显式调用 4、const 成员 1)const 对象:将类对象说明成员 const 类型 掌握定义形式 注意:不能改变 const 对象的成员数据 必须对 const 对象进行初始化 const 对象只能访问对象中的 const 成员函数 2)const 成员函数(const 与类成员函数结合) 掌握定义形式 注意:不能改变类中成员数据的值,也不能调用非 const 成员函数 const 对象只能调用 const 成员函数 普通对象优先考虑非 const 成员函数 3)const 数据成员 掌握定义形式和赋值形式 注意:不能在类定义时直接赋值 不能在任何函数中对其赋值 构造函数只能够通过初始化列表对其初始化 class CA { char *ps; public: CA() {ps=0;} CA(char *s) { if(s.ps) { ps=new char[strlen(s)+1]; strcpy(ps,s); } else ps=0; } CA (CA &s); ~CA() { if (ps) delete[]ps;} char *gets() {return ps;} }; CA::CA(CA &s) { if(s.ps) { ps=new char[strlen(s)+1]; strcpy(ps,s); } else ps=0; } void main() { CA s1(“china”); { CA s2(s1);} cout<>)) 面向对象程序设计 constconst成员成员** constconst对象对象 定义形式定义形式 prev next back 类名类名 const const 对象名对象名 const const 类名类名 对象名对象名 11、不能改变、不能改变constconst对象的成员数据对象的成员数据 22、、constconst对象只能访问对象中的对象只能访问对象中的constconst成员函数成员函数 33、必须对、必须对constconst对象进行初始化对象进行初始化 Time const t1(12,34,46);//t1Time const t1(12,34,46);//t1是常对象是常对象 A const a1(12,13);//a1A const a1(12,13);//a1是常对象是常对象 例例10.1910.19 面向对象程序设计 constconst成员成员 constconst成员函数成员函数 定义形式定义形式 prev next back <<类型说明符类型说明符> <> <函数名函数名> (> (参数表参数表) ) constconst 11、只能引用本类中成员数据,而不能修改其值,、只能引用本类中成员数据,而不能修改其值, 也不能调用非也不能调用非constconst成员函数成员函数 22、、constconst对象只能调用对象只能调用constconst成员函数成员函数 33、普通对象优先考虑非、普通对象优先考虑非constconst成员函数成员函数 例例10.2010.20 面向对象程序设计 constconst成员成员 constconst成员数据成员数据 定义形式定义形式 prev next back const const <<类型说明符类型说明符> > 变量名变量名 11、不能在类定义时直接赋值、不能在类定义时直接赋值 22、不能在任何函数中对其赋值、不能在任何函数中对其赋值 33、构造函数只能够通过初始化列表对其初始化、构造函数只能够通过初始化列表对其初始化 例例10.2110.21 类构造函数:常变量名(值)类构造函数:常变量名(值){ { }} 面向对象程序设计 constconst成员成员** 简单计算器简单计算器 prev next back class Calculatorclass Calculator { public:{ public: Calculator(){ answer=0;}Calculator(){ answer=0;} double double add(doubleadd(double a, double b) consta, double b) const {{ return return a+ba+b;; }} double double sub(doublesub(double a, double b) consta, double b) const { return a{ return a--b; }b; } };}; 面向对象程序设计 友元友元** 友元函数友元函数 定义形式定义形式 prev next back friendfriend <<类型类型> > 友元函数名(参数表)友元函数名(参数表) 11、不是类的成员函数,但可以访问类所有的成员、不是类的成员函数,但可以访问类所有的成员 22、可以类的任何部分声明、可以类的任何部分声明 33、实现可以在类外(不需要加上、实现可以在类外(不需要加上::::) ) 也可以在类内也可以在类内 例例10.2210.22 复数的运算复数的运算 面向对象程序设计 友元友元 prev next back class CAclass CA { { intint a; a; public: public: friend void A();friend void A(); };}; class CBclass CB {{ intint b;b; public: public: friend void A();friend void A(); };}; void A()void A() { CA a1; CB b1;{ CA a1; CB b1; a1.a=1; b1.b=2;a1.a=1; b1.b=2; }} 面向对象程序设计 友元友元 友元成员函数友元成员函数 定义形式定义形式 prev next back friend >类名类名1::1::成员函数名(参数表)成员函数名(参数表) class CAclass CA { { public: void A();};public: void A();}; class CBclass CB { public: friend void CA::A();};{ public: friend void CA::A();}; void CA::A()void CA::A() { { 直接访问直接访问CACA类和类和CBCB类的所有成员类的所有成员}} 例例10.2410.24 求面积求面积 面向对象程序设计 友元友元** 友元类友元类 prev next back class CAclass CA { { public: void A();public: void A(); void B(); };void B(); }; class CBclass CB { public: { public: friend class CAfriend class CA;};} void CA::A()void CA::A() { { 直接访问直接访问CACA类和类和CBCB类的所有成员类的所有成员}} void CA::B()void CA::B() { { 直接访问直接访问CACA类和类和CBCB类的所有成员类的所有成员}} 面向对象程序设计 注意事项注意事项 合理的友元可以有助于数据共享,合理的友元可以有助于数据共享, 提高程序的效率。提高程序的效率。 副作用:破坏了信息隐藏。副作用:破坏了信息隐藏。 友元没有对称性和传递性。友元没有对称性和传递性。 面向对象程序设计 类静态成员类静态成员** 静态数据成员静态数据成员 定义:定义: 作用:为了对象之间的沟通作用:为了对象之间的沟通 prev next back static static 类型名类型名 变量名变量名 11、静态数据成员的定义或说明时前面加关键字、静态数据成员的定义或说明时前面加关键字staticstatic 22、引用数据成员时,如果静态数据成员访问权限允、引用数据成员时,如果静态数据成员访问权限允 许,采用以下格式调用:许,采用以下格式调用: 类名类名::::静态成员名静态成员名 必须对静态数据成员初始化必须对静态数据成员初始化 面向对象程序设计 类静态成员类静态成员 静态数据成员静态数据成员 初始化格式:初始化格式: prev next back 类型类型 类名类名::::静态数据成员静态数据成员==值值 11、初始化在类体外进行,前面不加、初始化在类体外进行,前面不加staticstatic 22、初始化时不加该成员的访问权限控制符、初始化时不加该成员的访问权限控制符 33、初始化时使用作用域运算符来标明它的所属类、初始化时使用作用域运算符来标明它的所属类 例例10.26 10.26 自动编号自动编号 面向对象程序设计 类静态成员类静态成员 静态成员函数静态成员函数 定义形式:成员函数前使用定义形式:成员函数前使用staticstatic说明说明 目的:处理静态数据成员目的:处理静态数据成员 prev next back 11、是类的成员函数,调用时采用类名、是类的成员函数,调用时采用类名::::函数名函数名 22、可以调用静态成员,但调用非静态成员时必须、可以调用静态成员,但调用非静态成员时必须 借助对象借助对象 使用范例一使用范例一 面向对象程序设计 类静态成员类静态成员 对静态成员函数的进一步认识对静态成员函数的进一步认识 prev next back 11、编译器对静态成员函数的处理是内部的,、编译器对静态成员函数的处理是内部的, 在多文件联编中,不会与其他同名函数冲突在多文件联编中,不会与其他同名函数冲突 22、可以在建立任何对象之前处理静态数据成员、可以在建立任何对象之前处理静态数据成员 使用范例二使用范例二 面向对象程序设计 类静态成员类静态成员 设计一个简单的银行帐户类设计一个简单的银行帐户类 AnnualrateAnnualrate为年利率为年利率 BalanceBalance为存款为存款 提供月利息计算函数提供月利息计算函数 提供年利率调整函数提供年利率调整函数 提供输出函数提供输出函数 prev next back 银行帐户银行帐户 面向对象程序设计 类静态成员类静态成员 设计设计scorescore类,统计一个班学生信息类,统计一个班学生信息 利用利用totalstotals存储学生成绩存储学生成绩 利用利用 re_totalsre_totals返回成绩返回成绩 prev next back class class CStudentCStudent {{private:intprivate:int num;num; char name[20];char name[20]; double score;double score; static double totals;static double totals; public:public: CStudent(intCStudent(int n,charn,char **sname,doublesname,double s)s) static double static double re_totalsre_totals(){ return totals;}(){ return totals;} }; }; 面向对象程序设计 类静态成员类静态成员 prev next back double double CStudent::totalsCStudent::totals=0.0;=0.0; CStudent::CStudent(intCStudent::CStudent(int n,charn,char **sname,doublesname,double s)s) {{ totals+=s;totals+=s; num=n; num=n; strcpy(name,snamestrcpy(name,sname); score=s;); score=s; }} void main()void main() {{ intint num,id;charnum,id;char name[20];double score;name[20];double score; coutcout<<"<<"intputintput student number:";student number:"; cincin>>num;>>num; for (for (intint i=0;i>id;>>id; coutcout<<"student name:";<<"student name:"; cincin>>name;>>name; coutcout<<"student score:";<<"student score:"; cincin>>score;>>score; CStudentCStudent stu(id,name,scorestu(id,name,score);); }} coutcout<<"The total score <<"The total score is:"< class CBox { int h,w; public: CBox(int a=10,int b=10) {h=a; w=b;} friend int get_area(CBox &); }; int get_area(CBox &s ) { return s.h*s.w; } void main() { CBox a; int area=get_area(a); cout< class watch { public: watch(){start=clock();} ~watch(); private: clock_t start; }; watch::~watch() { clock_t total=clock()-start; cout<<"消耗的时间为:"< class complex { float a,b; public: complex() {a=0;b=0;} complex(float i,float j ) { a=i;b=j;} friend complex Add(complex &comp1, complex &comp2); friend complex Sub(complex &comp1,complex &comp2); friend void disp(complex &comp1); }; complex Add(complex &comp1,complex &comp2) { float x=comp1.a+comp2.a; float y=comp1.b+comp2.b; return complex(x,y); } void disp(complex &comp1) { if (comp1.b>0) cout< #include class CCourse; class CStudent { int number; char name[10]; int course[3]; public: CStudent() void Get_Info() friend void Show_Info(CStudent[] ,CCourse[] ); }; class CCourse { int code; char coursename[10]; public: CCourse(){ code=0; strcpy(coursename,"no");} void Get_Info() friend void Show_Info(CStudent [] ,CCourse [] ); }; void Show_Info(CStudent s[],CCourse c[]) { cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"选修课程 A"<<'\t'<<"选修课程 B"<<'\t'<<"选修课程 C"< class SavingAccount { public: SavingAccount( double b) { double temp=(b>=0?b:0); balance=temp; } void printbalance() const; void MonthlyInterest(); static void modifyannualRate(double); private: double balance;//存款 static double annualRate;//年利率 }; double SavingAccount::annualRate=0.0; void SavingAccount::MonthlyInterest()//月利息计算函数 { balance+=balance*(annualRate/12.0); } void SavingAccount::modifyannualRate(double i) { annualRate=(i>=0&&i<=1.0)?i:0.03; } void SavingAccount::printbalance() const //打印 { cout< #include #include #include class CDate { int year,month,day; public: CDate(int y=1900,int m=1,int d=1) { year=y;month=m;day=d; } void CurrentDate() { time_t timep; struct tm *p; time(&timep); p=localtime(&timep); year=1900+p->tm_year; month=p->tm_mon+1; day=p->tm_mday; } void DatetoStr(char *str,int sign=1) { char signstr[80]; switch (sign) { case 1: strcpy(signstr,"%d 年%d 月%d 日"); sprintf(str,signstr,year,month,day);break; case 2: strcpy(signstr,"%d-%d-%d"); sprintf(str,signstr,year,month,day);break; case 3: strcpy(signstr,"%d/%d/%d"); sprintf(str,signstr,year,month,day);break; }; } }; void main() { CDate t,t1; t.CurrentDate(); char str[80]; t.DatetoStr(str,2); cout< #include class Cpoint { int x,y; public: Cpoint() { x=0;y=0; } Cpoint(int a,int b) { x=a; y=b;} Cpoint (Cpoint &a) { x=a.x; y=a.y; } int getx(){return x;} int gety(){return y;} }; class tria { Cpoint A,B,C; public: tria(Cpoint a, Cpoint b, Cpoint c):A(a),B(b),C(c) {} double lenAB(Cpoint a,Cpoint b) { double len=sqrt((b.getx()-a.getx())*(b.getx()-a.getx())+(b.gety()-a .gety())*(b.gety()-a.gety())); return len; } double area() { double s,len1,len2,len3,a; len1=lenAB(A,B); len2=lenAB(A,C); len3=lenAB(B,C); s=(len1+len2+len3)/2; a=sqrt(s*(s-len1)*(s-len2)*(s-len3)); return a; } }; void main() { Cpoint A(1,1),B(3,1),C(3,2); tria t(A,B,C); cout< #include #include class calculator { double a,b; public: calculator(){a=0;b=0;} void newa() { double num; cout<<"input the number:"; cin>>num; a=num; } void newab() { double num1,num2; cout<<"input the first number:"; cin>>num1; cout<<"input the second number:"; cin>>num2; a=num1; b=num2; } double Add(calculator &A); double Sub(calculator &A); double Sin(calculator &A); }; double calculator::Add(calculator &A) { return A.a+A.b; } double calculator::Sub(calculator &A) { return A.a-A.b; } double calculator::Sin(calculator &A) { return sin(A.a); } void main() { int sel; calculator cal; cout<<"welcome to use the calculator!please select."<>sel; switch (sel) { case 0:break; case 1:cal.newab(); cout<<"the result is:"< class M { public: M(int a) { A=a; B=a;} static void f1(); void f2(); private: int A; static int B; }; int M::B=0; void M::f1() { //cout<< “A=”< const int max=100; class set { int list[max]; int pc;//集合元素个数 public: set() { pc=0; cout<<"a empty set construct!"<=100) pc=100; else pc=size; for (int i=0;imax) { cout<<"The set is full"<0) cout< class small_cat { private: double weight; static double total_weight; static double total_number; public: small_cat(double w) { weight=w; total_weight+=w; total_number++; } void display() { cout<<"The small_cat weights "<>name; } void CStudent::outputinfo() { cout< class CBase { int x; protected: int y; public: int z; CBase(int a, int b, int c) {x=a; y=b; z=c;} int Getx(){return x;} int Gety(){return y;} void ShowBase(){cout<<"x="< #include class point { public: point(int initx,int inity,int c=255) { x=initx; y=inity; color=c; } void show(); void hide(); void moveto(int newx,int newy); protected: int x,y,color; }; void point::show() { printf("location is:(%d,%d)\n",x,y); printf("color is:%d\n",color);} void point::hide() { printf("location is:(%d,%d)\n",x,y); printf("color is:%d\n",0);} void point::moveto(int newx,int newy) { hide(); x=newx; y=newy; show();} class circles:public point { public: circles(int initx,int inity,int r,int c=255):point(initx,inity,c) { radius=r; } void show(); void hide(); void moveto(int newx,int newy); void expand(int expandby); void contract(int contractby); private: int radius; }; void circles::show() { cout<<"The circle's infomation:"< #include class Person {public: Person(const char *n,const char *t,const char *a); void print() const; ~Person(); protected: char *name; char *tel; char *add; }; Person::Person(const char *n,const char *t,const char *a) { name=new char[strlen(n)+1]; strcpy(name,n); tel=new char [strlen(t)+1]; strcpy(tel,t); add=new char[strlen(a)+1]; strcpy(add,a); } void Person::print() const { cout< class base { protected: int a; public: base() {a=5;} }; class base1:public base {public: base1() { cout<<"base1 a="<display(); pt=&grad1; pt->display(); } class twoD { protected: double x, y; // x 和 y 坐标 public: twoD(double i, double j):x(i), y(j){} void setX(double NewX){x = NewX;} void setY(double NewY){y = NewY;} double getX() const {return x;} double getY() const {return y;} double getSum() const {return x+y;} }; class threeD:public twoD { private:double z; public: threeD(double i, double j, double k):twoD(i,j){z = k;} void setZ(double NewZ){z = NewZ;} double getZ() {return z;} double getSum() const {return x+y+z;} }; 东莞理工学院教案 (首页) 课程名称:《面向对象程序设计》 第五章 教学时数:3 学时 授课对象: 计算机专业 2007 级 授 课 人: 王静 授课形式: 理论课 教 案 内 容 一、教学目的: 1、继承的概念和分类 2、单一继承的定义形式、不同派生方式的访问权限控制 3、派生类初始化 4、多重继承的概念和应用 5、继承其他问题的讨论 二、教学重点和难点 重点:继承的定义 难点:派生类初始化、成员覆盖问题 三、教学内容要点: 1.继承 1)面向对象分析中泛化/特化的概念 2)面向对象编程中的继承概念 3)了解继承的分类以及其区别 4)单一继承的定义形式 5)单一继承中不同派生方式,基类和派生类成员的继承关系 2、派生类初始化 1) 了解派生类构造函数和析构的调用次序 2) 了解派生类构造函数与基类构造函数的关系 3) 当含有对象成员时,初始化次序 3、多重继承 1) 多重继承的定义 2) 多重继承的析构和构造函数 4、其他问题 1) 访问权限调整 2) 多重继承的二义性 3) 成员覆盖问题 教案首页书写要求: (1) 教案书写以简洁、明了、扼要为宜。 (2) 教学对象包括专业、年级、学生。 (3) 教学目的与教学大纲相一致。 (4) 教学内容要点力求按大纲要求、准确、适度、易于操作。 (5) 教学要求要点包括: 1. 基本概念、理论及知识的掌握; 2. 重点、难点的讲授; 3. 补充相应的知识内容。 东莞理工学院教案 (首页) 课程名称:《面向对象程序设计》 第五章 教学时数:3 学时 授课对象: 计算机专业 2007 级 授 课 人: 王静 授课形式: 理论课 教 案 内 容 一、教学目的: 1、进一步学习继承,对几个需注意的问题的进行讨论 2、掌握虚基类的定义和使用 二、教学重点和难点 重点:继承的成员覆盖和赋值兼容问题,虚基类的定义和初始化 难点:继承的赋值兼容、虚基类的初始化 三、教学内容要点: 1.对继承相关问题的讨论 1)访问类型调整 作用:私有派生类对象或外部函数是不能够访问基类任何成员的,保护派生也有相 似情形。为了使得可以访问,而采用访问声明的方法。 定义形式: 基类名::基类成员 注意:a.基类成员必须是 public 或 protected 类型的成员 b.基类 public 成员只能调整为派生类的 public 成员,基类 protected 成员 只能调整为派生类的 protected 成员 c.访问声明只对私有派生和保护派生起作用 2)多重继承的二义性问题 问题提出:派生类从多个类中继承属性和服务,难免会出现基类中存在同名数据或 函数的问题。 解决方法:使用作用域运算符或者使用成员覆盖的方法解决 3)成员覆盖 作用:主要是解决继承类间(类层次结构中)存在的同名问题。 处理的原则: 如果存在同名,则派生类对象优先考虑调用本类的函数。 如果是多层继承(单一继承),层次结构的类中存在同名函数,那么 先考虑派生类的直接基类。 4)赋值兼容 作用:基类与派生类之间的转换 原则:公有派生类对象可以直接赋值给基类的对象 保护和私有派生类对象不可赋值给基类对象 基类对象不可赋值给派生类对象 2、虚基类 1) 目的是为了解决多重继承的二义性 2) 定义形式: 3) 对初始化的讨论:注意构造函数的执行次序 原则:若同一层次中包含多个虚基类,按说明的先后次序调用构造函数 若同一层次中同时包含虚基类和非虚基类,先初始化虚基类 若虚基类是非虚基类的派生类,先初始化基类 教案首页书写要求: (1) 教案书写以简洁、明了、扼要为宜。 (2) 教学对象包括专业、年级、学生。 (3) 教学目的与教学大纲相一致。 (4) 教学内容要点力求按大纲要求、准确、适度、易于操作。 (5) 教学要求要点包括: 1. 基本概念、理论及知识的掌握; 2. 重点、难点的讲授; 3. 补充相应的知识内容。 #include #include typedef char string[80]; class Date { public: Date(){} Date(int y,int m,int d) { SetDate(y,m,d); } void SetDate(int y,int m,int n) { Year=y; Month=m; Day=n; } void GetStringDate(string &Date) { sprintf(Date,"%d/%d/%d",Year,Month,Day); } protected: int Year,Month,Day; }; class Time { public: Time(){} Time(int h, int m, int s){SetTime(h,m,s);} void SetTime(int h,int m,int s) { Hours=h; Minutes=m; Seconds=s; } void GetStringTime(string &Time) { sprintf(Time,"%d/%d/%d",Hours,Minutes,Seconds); } protected: int Hours,Minutes,Seconds; }; class TimeDate:public Date,public Time { public: TimeDate(){} TimeDate(int y,int mo,int d,int h,int mi,int s) :Date(y,mo,d),Time(h,mi,s){} void GetStringDT(string &DTstr) { sprintf(DTstr,"%d/%d/%d%d:%d:%d",Year,Month,Day,Hours,Minutes,Second s); } }; void main() { TimeDate date1; string Demostr; date1.SetDate(1998,8,7); date1.SetTime(10,30,34); date1.GetStringDT(Demostr); cout<<"The date1 date and time is:"< class base {protected: int a; public: base() {a=5;} }; class base1:virtual public base {public: base1() { cout<<"base1 a="<calc(); p=&a; p->calc(); } #include #include class CShape {public: CShape(double x, double y) { xcode=x;ycode=y; } virtual double volumn(){return 0.0;} protected: double xcode,ycode; }; class CBall:public CShape {public: CBall(double x, double y,double r):CShape(x,y) { radius=r;} double volumn() { return 3.14*1.33*radius*radius;} protected: double radius; }; class CRectangle:public CShape {public: CRectangle(double x, double y, double h):CShape(x,y) { high=h;} double volumn() { return xcode*ycode*high;} protected: double high; }; void fun(CShape *p) { cout<volumn()< class CA {public: void fun1() { cout<<"CA::fun1()"< class CBase { public: virtual void f1() { cout<<"F1 of base"<f1(); ptr->f2(); ptr->f3(); ptr=&obj2; ptr->f1(); ptr->f2(); ptr->f3(); } #include class CBase {public: CBase() { cout<<"base"<clone();} #include class Base {public: Base() { cout<<"base"< class CAbs {protected: int x; public: CAbs(){ x=1000;} virtual void print()=0; void fun(){ cout<<"fun fo CAbs"< #include using namespace std; class Student {public: Student(int,string,float); void display(); private: int num; string name; float score; }; Student::Student(int n, string nam,float s) {num=n; name=nam; score=s; } void Student::display() {cout<display(); pt=&grad1; pt->display(); } #include class CShape { public: virtual void draw()=0; }; class CCircle:public CShape {private: int radius; public: CCircle(){ radius=0;} void draw(){ cout<<"radius:"<obj=ptr; temp->next=NULL; if (tail) tail->next=temp; tail=temp; temp->next=NULL; if (!head) head=tail; count++; } CShape *CDrawList::Getnode(int i) { if (i<=count) { CShape *temp; CDrawList *p=head; if (!head) { cout<<"list empty"<next;i--;} temp=p->obj; return temp;} else { cout<<"out of array"<draw();} } 东莞理工学院教案 课程名称:《面向对象程序设计》 第六章 (198 页~219 页) 教学时数:3 学时 授课对象: 计算机专业 07 级 授 课 人: 王静 授课形式: 理论课 教 案 内 容 一、教学目的: 1、掌握多态性的概念,了解 C++中两种不同多态性的实现 2、掌握虚函数的定义 3、了解虚函数表的实现,以及在多态性实现中所起的作用 4、区分虚函数与函数重载、了解多重继承中对虚函数的处理、了解虚析构函数的作用 5、纯虚函数和抽象类的实现 二、教学重点和难点 重点:虚函数的定义和使用、纯虚函数和抽象类的实现 难点:虚函数表、纯虚函数 三、教学内容要点: 1.多态性的概念 2.虚函数的定义 3.虚函数的实现:虚函数表 4.虚函数的几点问题讨论 1)与函数重载的关系 2)与多重继承的关系 3)虚析构函数 5、纯虚函数的作用,纯虚函数的定义,抽象类的实现 6、范例 #include #include class arithexpr {public: arithexpr(){} virtual ~arithexpr(){} virtual double value(double x)=0; }; //数字类 class numexpr: public arithexpr {private: double val; public: numexpr(double v):val(v){} ~numexpr() {} virtual double value(double x) {return val;} }; //变量类 class varexpr: public arithexpr {public: varexpr(){} ~varexpr(){} virtual double value(double v) {return v;} }; //加法类 class addexpr: public arithexpr {private: arithexpr* a1; arithexpr* a2; public: addexpr(arithexpr* e1, arithexpr* e2):a1(e1),a2(e2) {} ~addexpr() {delete a1;delete a2;} virtual double value(double x) {return a1->value(x)+a2->value(x);} }; //减法类 class subexpr: public arithexpr {private: arithexpr* a1; arithexpr* a2; public: subexpr(arithexpr* e1, arithexpr* e2):a1(e1),a2(e2) {} ~subexpr() {delete a1;delete a2;} virtual double value(double x) {return a1->value(x)-a2->value(x);} }; //乘法类 class multiexpr: public arithexpr {private: arithexpr* a1; arithexpr* a2; public: multiexpr(arithexpr* e1, arithexpr* e2):a1(e1),a2(e2) {} ~multiexpr() {delete a1;delete a2;} virtual double value(double x) {return a1->value(x)*a2->value(x);} }; //除法类 class divexpr: public arithexpr {private: arithexpr* a1; arithexpr* a2; public: divexpr(arithexpr* e1, arithexpr* e2):a1(e1),a2(e2) {} ~divexpr() {delete a1;delete a2;} virtual double value(double x) {return a1->value(x)/a2->value(x);} }; //乘方类 class powexpr: public arithexpr {private: arithexpr* a1; arithexpr* a2; public: powexpr(arithexpr* e1, arithexpr* e2):a1(e1),a2(e2) {} ~powexpr() {delete a1;delete a2;} virtual double value(double x) {return pow(a1->value(x),a2->value(x));} }; //算术函数类 typedef double (*func)(double); class funcexpr: public arithexpr {private: func f; arithexpr* arg; public: funcexpr (func fn,arithexpr* a):arg(a),f(fn){} ~ funcexpr () {delete arg;} virtual double value(double x) {return f(arg->value(x));} }; void main() { arithexpr* a; //表达式 2x+3 a=new addexpr(new multiexpr(new numexpr(2),new varexpr()),new numexpr(3)); cout<<"当 x=3 时,2x+3="<value(3)< class CShape {protected: double x,y; public: CShape(double a,double b) { x=a; y=b; } virtual void area() { cout<<"No area computation defined"; cout<<"for this class."<area(); p=&r; p->area(); p=&c; p->area();} #include "iostream.h" //没有虚函数的类 class A { public: int a; A():a(0){} }; //有一个虚函数的类 class B { public: int a; B():a(0){} virtual void func(){} }; //有两个虚函数的类 class C { public: int a; C():a(0){} virtual void func(){} virtual void func2(){} }; void main() { cout<<"没有虚函数的类大小是"< class base1 {public: virtual void fun() { cout<<"base1"<fun(); ptr2=&obj3; ptr2->fun(); } class A { public: int *a; A() { a=new(int); } virtual void func1(){} virtual void func2(){} virtual ~A() {delete a; cout<<"delete a"< #include class CIntList { public: CIntList *head; CIntList *tail; int count; int num; CIntList *next; CIntList() { head=tail=next=NULL;} virtual void add(int i)=0; virtual int remove()=0; int getcount(); }; int CIntList::getcount() { return count;} class CQueue:public CIntList {public: void add(int i); int remove(); }; void CQueue::add(int i) { CIntList *item; item=new CQueue; if (!item) { cout<<"allocation error"<num=i; if (tail) tail->next=item; tail=item; item->next=NULL; if (!head) head=tail; count++; } int CQueue::remove() { int i; CIntList *p; if (!head) { cout<<"list empty"<num; p=head; head=head->next; count--; delete p; return i; } class CStack:public CIntList {public: void add(int i); int remove(); }; void CStack::add(int i) { CIntList *item; item=new CStack; if (!item) { cout<<"allocation error"<num=i; if (head) item->next=head; head=item; if (!tail) tail=head; count++; } int CStack::remove() { int i; CIntList *p; if (!head) { cout<<"list empty"<num; p=head; head=head->next; count--; delete p; return i; } void main() { CIntList *p; CQueue queue; p=&queue; p->add(1); p->add(3); p->add(5); cout<<"queue:"; int num=p->getcount(); for (int i=0;iremove()<<" "; } cout<add(1); p->add(3); p->add(5); cout<<"stack:"; num=p->getcount(); for (i=0;iremove()<<" "; } } #include class my_base { int a,b; public: my_base(int x,int y) { a=x; b=y; } void show() { cout<<"my_base"<print(); derived1 d1(3); op=&d1; op->print(); derived2 d2(15); op=&d2; op->print();} #include class Point //声明类 Point {public: Point(float x=0,float y=0); void setPoint(float,float); float getX() const{return x;} float getY() const{return y;} friend ostream &operator<<(ostream &,const Point &);//重载运算符"<<" protected: float x,y;}; Point::Point(float a,float b) {x=a; y=b;} void Point::setPoint(float a,float b) {x=a; y=b;} ostream &operator<<(ostream &output,const Point &p) {output<<"["< class Point //声明类 Point {public: Point(float x=0,float y=0); void setPoint(float,float); float getX() const{return x;} float getY() const{return y;} friend ostream &operator<<(ostream &,const Point &);//重载 运算符"<<" protected: float x,y;}; Point::Point(float a,float b) {x=a; y=b;} void Point::setPoint(float a,float b) {x=a; y=b;} ostream &operator<<(ostream &output,const Point &p) {output<<"["<>x; cout<>a; cout<>”,实现 对象的输入和输出。重载这二个运算符时,在对象 所在的类中,将重载这二个运算符的函数说明该类 的友元函数。 重载提取运算符的一般格式为: 友元函数 friend istream & operater >>(istream &, ClassName &); 返回值类型 函数名 左操作数 右操作数 cin>>a; operator>>(cin, a) 友元函数 friend istream & operater >>(istream &, ClassName &); 返回值类型 函数名 左操作数 右操作数 cin>>a; operator>>(cin, a) 返回值类型:类istream的引用,cin中可以连续使用运算 符“>>”。 cin>>a>>b; 第一个参数:是“>>”的左操作数cin类型,类istream的引用 第二个参数:是“>>”的右操作数,即欲输入的对象的引用. istream & operater >>(istream &is, ClassName &f); class A { float x, y; public: ..... }; ..... A a; cin>>a; .... friend istream & operater >>(istream &, A &); istream & operater >>(istream &is, A &a) { cout<<“ Input a:”<>a.x>>a.y; return is; } 重新定义输入流 在类中原型说明 在类外定义函数 返回输入流 class incount{ int c1,c2; public:incount(int a=0,int b=0) { c1=a; c2=b; } void show(void){cout<<"c1="<>(istream &,incount &); }; istream & operator>>(istream &is, incount &cc) { is>>cc.c1>>cc.c2; return is; } void main(void) { incount x1,x2; x1.show (); x2.show (); cin>>x1; cin>>x2; x1.show (); x2.show (); } 重载输入函数原型说明 重载输入函数定义 友元函数 friend ostream & operater <<(ostream &, ClassName &); 返回值类型 函数名 左操作数 右操作数 cout<>(istream &, ClassName &); 与输入(提取)运算符比较: 将输入流改为输出流。 class A { float x, y; public: ..... }; ..... A a(2,3); cout< #include using namespace std; int main() { double values[]={1.23,35.36,653.7,4358.24}; char *names[]={"Zoot","Jimmy","Al","Stan"}; for(int i=0;i<4;i++) cout< #include using namespace std; int main() { double values[]={1.23,35.36,653.7,4358.24}; char *names[]={"Zoot","Jimmy","Al","Stan"}; cout<>x; cout< 其中定义了各种文件操作运算符及函数。 内存变量 (程序) 键盘 输入文件 屏幕 输出文件 cin>>x cout<>x outfile<>x>>y; myfile1.txt 3 4 内存 infile x y 3 4 用 infile 代替myfile1.txt 进行操作。 ifstream outfile; //定义输出文件类对象 infile.open(“myfile2.txt”);//利用函数打开某一文件 float x=3 , y=4; outfile< #include main() { ifstream infile; ofstream outfile; infile.open("myfile1.txt"); outfile.open("myfile2.txt"); float x,y; infile>>x>>y; outfile<>a[i];//将“file1.txt”中的十个整型数输入到a[i]中 for(i=0;i<10;i++) outfile<>ch; //输入 pfile2<>filename1; cout<<"Input destination: "; cin>>filename2; ifstream infile(filename1); ofstream outfile(filename2); char ch; while(infile.get(ch)) outfile.put(ch); infile.close(); outfile.close(); } 输入文件(源文件)名 输出文件(目的文件)名 用构造函数打开文件 从源文件中读取一个字 符,至文件尾停止循环 将该字符输出至目的文件 关闭文件 void main(void) { char filename1[256],filename2[256]; char buf[300]; cout<<"Input source file name: "; cin>>filename1; cout<<"Input destination: "; cin>>filename2; fstream infile,outfile; infile.open(filename1,ios::in); outfile.open(filename2,ios::out); while(infile.getline(buf,300)) outfile<>filename1; cout <<”输入目的文件名:”; cin >>filename2; fstream infile,outfile; infile.open(filename1,ios::in | ios::binary); outfile.open(filename2,ios::out | ios::binary); int n; while (!infile.eof()){ //文件不结束,继续循环 infile.read(buff,4096); //一次读4096个字节 n=infile.gcount(); //取实际读的字节数 outfile.write(buff,n); //按实际读的字节数写入文件 } infile.close(); outfile.close(); } 文件指针 文件内容文件指针 当一打开文件,文件指针位于文件头,并随着读写 字节数的多少顺序移动。 可以利用成员函数随机移动文件指针。 随机读取二进制文件 infile.seekg(int);//将文件指针移动到由参数指定的字节处 infile.seekg(100);//将文件指针移动到距离文件头100个字 节处 infile.seekg(int, ios::_dir); 移动的字节数 相对位置 infile.seekg(100, ios::beg);//移动到距文件头100个字节 _dir: beg: 文件头 cur: 当前位置 end: 文件尾 infile.seekg(-100, ios::cur);//移动到距当前位置前100个字节 infile.seekg(-500, ios::end);//移动到距文件尾前500个字节 void main(void ) { ofstream outfile(“data1.dat”,ios::out| ios::binary); int i; for(i=5;i< 1000;i+=2 ) outfile.write((char*)&i,sizeof(int));//将奇数写入文件 outfile.close();//关闭文件 ifstream f1(“data.dat”,ios::in| ios::binary); int x; f1.seekg(20*sizeof(int));//将文件指针移到第20个整数的位置 for(i=0;i<10;i++) {f1.read((char *)&x,sizeof(int)); //依次读出第20~29个奇数到x cout<< x<< ‘\t’; } f1.close(); } 以读的方式打开原文件 设在缺省目录下有文件file1.txt,文件中内容为: 123456 执行下述程序后,程序的输出是__________。 void main(void) { fstream f1; int tmp, sum=0; f1.open(“file1.txt”,ios::in); while(f1>>tmp) sum+=tmp; f1.close( ); cout<

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档