第4章C程序设计教程与实验指导杨国兴类与对象.ppt
《第4章C程序设计教程与实验指导杨国兴类与对象.ppt》由会员分享,可在线阅读,更多相关《第4章C程序设计教程与实验指导杨国兴类与对象.ppt(64页珍藏版)》请在三一文库上搜索。
1、C+语言程序设计,杨国兴 张东玲 彭涛,中国水利水电出版社,第4章 类与对象,4.1 类与对象 4.2 构造函数与析构函数 4.3 类的组合 4.4 友元 4.5 静态成员 4.6 对象数组与对象指针 4.7 this指针,4.1 类与对象,4.1.1 类与对象的概念 对象(object):是现实世界中的客观事物。 类(class):是把具有相同属性的事物划分为一类,从而得出的抽象概念。 面向对象程序设计中的类,是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了抽象的描述。 对象是类的实例,类是同种对象的抽象。,第4章 类与对象,如:确定大小和颜色的矩形都是一个个具体的对象,而
2、将所有矩形的共同特点抽象出来,就是一个矩形类。 这些共有的属性包括颜色 ( color ),左上角坐标 ( left, top ),长 ( length )和宽 ( width ) 等; 对这些属性的处理包括改变矩形的颜色 ( SetColor ) 和大小 ( SetSize ) ,移动矩形到新的位置 ( Move ),绘出矩形 ( Draw ) 等。将矩形的这些属性和方法作为一个整体,封装在一起形成一个矩形类。,4.1 类与对象,4.1.2 类的声明 class 类名 private: 私有数据成员和成员函数; protected: 保护数据成员和成员函数; public: 公有数据成员和成
3、员函数; ;,第4章 类与对象,例4.1 定义一个长方形类CRect,其数据成员包括颜色,左上角坐标,长和宽,其函数成员包括改变矩形的颜色(SetColor)和大小(SetSize),移动矩形到新的位置(Move),绘出矩形(Draw)。,class CRect private: char color10; int left; int top; int length; int width; public: void SetColor(char *c); void SetSize(int l, int w); void Move(int t,int l); void Draw(); ;,第4章
4、类与对象,例4.1 (续一),void CRect:SetColor(char *c) strcpy(color, c); void CRect:SetSize(int l, int w) length=l; width = w; void CRect:Move(int t,int l) top = t; left = l; void CRect:Draw() cout “矩形左上角坐标为(“ left “,“ top “)“ endl; cout “矩形长和宽分别为“ length “,“ width endl; cout “矩形的颜色是“ color endl; ,第4章 类与对象,域运算
5、符(:)用于指出该函数是哪一个类的成员函数,用法: 类名:函数名(参数表),例4.1 (续二),void main() CRect r; r.SetColor(“Red“); r.Move(10,20); r.SetSize(100,200); r.Draw(); r.Move(50,50); r.SetColor(“Blue“); r.Draw(); ,第4章 类与对象,定义CRect类的对象,定义对象的格式: 类名 对象名1,对象名2,,访问对象的公有成员,格式为: 对象名.公有成员函数名(参数表) 对象名.公有数据成员名,程序运行结果为: 矩形左上角坐标为(20,10) 矩形长和宽分别为
6、100,200 矩形的颜色是Red 矩形左上角坐标为(50,50) 矩形长和宽分别为100,200 矩形的颜色是Blue,4.1 类与对象,4.1.3 成员的访问控制 private: 私有访问权限,只允许类中的成员函数访问,其他函数不能访问。 protected: 保护访问权限,在第7章中介绍。 public: 公有访问权限,在任何函数中都可以访问。 例:若主函数中有以下语句,是否正确? CRect r; strcpy( r.color , “red”); r.top = 10; r.left = 20;,第4章 类与对象,4.1 类与对象,4.1.3 成员的访问控制(续) 若不指定类中的成
7、员的访问权限,则默认为私有成员。 类也可以由struct关键字声明,strust与class的区别是:如果不指定访问权限,前者缺省的访问权限是公有的,而后者是私有的。用struct声明前面的矩形类: struct CRect void SetColor(char *c); void SetSize(int l, int w); void Move(int t,int l); void Draw(); private: char color10; int left; int top; int length; int width; ;,第4章 类与对象,4.1 类与对象,4.1.4 类的成员函数
8、1. 类成员函数的定义方式 在类外部定义:如前面定义的长方形类的成员函数 一般格式为: 函数类型 类名:成员函数名(参数说明) 函数体 在类中定义:如 class CRect public: void setcolor( char *c ) strcpy( color , c ); ;,第4章 类与对象,4.1 类与对象,4.1.4 类的成员函数(续一) 2. 内联成员函数 将成员函数的定义直接写在类中即成为内联成员函数 在类外定义时用inline指出: 如: inline void CRect:SetColor(char *c) strcpy(color, c); ,第4章 类与对象,4.1
9、 类与对象,4.1.4 类的成员函数(续二) 3. 带默认参数值的成员函数 注意:默认参数只能在声明或定义中的一处给出,即 如在类中的函数声明已经给出默认参数值: void SetSize(int l=100, int w=100); 则在函数定义时就不能再给出默认值。 同样如果在定义时给出了默认值: void CRect:SetSize(int l=100, int w=100) length=l; width = w; 在声明处就不能再给默认值了。,第4章 类与对象,4.2 构造函数与析构函数,构造函数:对对象进行初始化。 析构函数:在对象销毁时进行内存释放等清理工作。 4.2.1 构造函
10、数 1. 构造函数的特点 (1) 构造函数的函数名与类名相同。 (2) 不能定义构造函数的类型(即不能指明构造函数返回值的类型)。 (3) 构造函数应声明为公有函数。 (4) 构造函数不能在程序中调用,在对象创建时,构造函数被系统自动调用。 2. 构造函数的作用 构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于其它对象的特征。,第4章 类与对象,例 为CRect类添加构造函数,class CRect private: char color10; public: CRect( ); CRect(char *c, int t, int left
11、, int len, int wid); void SetColor(char *c); ; CRect:CRect() strcpy(color, “Black“); top = 0; left = 0; length = 0; width = 0; ,第4章 类与对象,例 为CRect类添加构造函数(续),CRect:CRect(char *c, int t, int lef, int len, int wid ) strcpy(color, c); top = t; left = lef; length = len; width = wid; void main() CRect r1;
12、/自动调用第一个构造函数 CRect r2(“red”, 10,10,100,100); /自动调用第二个构造函数 CRect r3(“green“, 200,200,50,50); /自动调用第二个构造函数 r1.Draw(); r2.Draw(); r3.Draw(); ,第4章 类与对象,例4.2 构造函数的初始化表,#include using namespace std; class A private: const double PI; int b; int ,第4章 类与对象,void main() A x(10); x.Output(); ,程序运行结果: 3.14,10,10
13、,4.2 构造函数与析构函数,4.2.2 析构函数 1. 析构函数的特点 (1) 析构函数名字为符号“”加类名。 (2) 析构函数没有参数,不能指定返回值类型。 (3) 一个类中只能定义一个析构函数,所以析构函数不能重载。 (4) 当一个对象作用域结束时,系统自动调用析构函数。 如CRect类的析构函数声明为:CRect(); 定义为: CRect:CRect() 2. 析构函数的作用 在删除一个对象前被调用,释放该对象成员的内存空间,以及其它一些清理工作。,第4章 类与对象,例4.3 设计一个简单的字符串类,类中有两个数据成员,分别表示字符串的长度和字符串的内容,有一个构造函数和一个析构函数
14、,函数GetLength( )返回字符串长度,函数GetContents( )获得字符串的内容,重载函数SetContents( )给字符串设置值。,#include #include using namespace std; class CString private: int length; char *contents; public: CString(); /构造函数 CString(); /析构函数 int GetLength(); void GetContents(char *str); void SetContents(int len, char *cont); void Set
15、Contents(char *cont); ;,第4章 类与对象,例4.3 (续一),CString:CString() length = 0; contents = NULL; cout “字符串对象初始化“ endl; CString:CString() cout contents “被销毁“ endl; if(contents != NULL) delete contents; int CString:GetLength() return length; void CString:GetContents(char *str) strcpy(str, contents); ,第4章 类与对
16、象,例4.3 (续二),void CString:SetContents(int len, char *cont) length = len; if(contents != NULL) delete contents; contents = new charlen+1; strcpy(contents,cont); cout “两个参数的SetContents函数“ endl; void CString:SetContents( char *cont) length = strlen(cont); if(contents != NULL) delete contents; contents =
17、 new charlength+1; strcpy(contents,cont); cout “一个参数的SetContents函数“ endl; ,第4章 类与对象,例4.3 (续三),void main() CString str1,str2; /两次调用构造函数 str1.SetContents(“第一个字符串“); /调用有一个参数的SetContents函数 str2.SetContents(20, “第二个字符串两个参数“); /调用有两个参数的SetContents函数 int i = str1.GetLength(); char string100; str1.GetConte
18、nts(string); cout i “ “ string endl; i = str2.GetLength(); str2.GetContents(string); cout i “ “ string endl; ,第4章 类与对象,程序运行结果为: 字符串对象初始化 字符串对象初始化 一个参数的SetContents函数 两个参数的SetContents函数 12 第一个字符串 20 第二个字符串两个参数 第二个字符串两个参数被销毁 第一个字符串被销毁,4.2 构造函数与析构函数,4.2.3 拷贝构造函数 拷贝构造函数也是构造函数,它的作用是用一个已经存在的对象初始化新对象,拷贝构造函数
19、的参数为该类对象的引用。 例4.4 设计一个复数类,两个数据成员分别表示复数的实部(real)和虚部(imag),三个构造函数分别在不同的情况下初始化对象,函数Set()设置复数实部和虚部的值,函数Print()输出复数,函数Add()和函数Sub()分别实现复数的加减法运算。,第4章 类与对象,例4.4 源程序,#include “iostream“ using namespace std; class CComplex private: double real; double imag; public: CComplex(); CComplex(double r, double i); C
20、Complex(CComplex ,第4章 类与对象,例4.4 源程序(续一),CComplex:CComplex() real = 0.0; imag = 0.0; CComplex:CComplex (double r, double i) real = r; imag = i; CComplex:CComplex (CComplex ,第4章 类与对象,例4.4 源程序(续二),/ 显示复数值 void CComplex:Print() cout “(“ real “,“ imag “)“ endl; / 返回两个复数的相加结果 CComplex CComplex:Add(CComple
21、x c) CComplex temp; temp.real = real + c.real; temp.imag = imag + c.imag; return temp; / 返回复数相减的结果 CComplex CComplex:Sub(CComplex c) CComplex temp; temp.real = real - c.real; temp.imag = imag - c.imag; return temp; ,第4章 类与对象,例4.4 源程序(续三),void main(void) CComplex a, b(3.0,4.0), c; CComplex d(b); /调用复
22、数类的拷贝构造函数 cout “a = “; a.Print(); cout “b = “; b.Print(); cout “d = “; d.Print(); c = b.Add(d); d = a.Sub(d); cout “c = “; c.Print(); cout “d = “; d.Print(); ,第4章 类与对象,程序运行结果为: a = (0, 0) b = (3, 4) d = (3, 4) c = (6, 8) d = (-3, -4),4.3 类的组合,类的组合就是在一个类中内嵌其他类的对象作为成员,因为内嵌对象是该类对象的组成部分,当创建该对象时,其内嵌对象也被自
23、动创建。 在C+中是通过构造函数的初始化表为内嵌对象初始化的。组合类带有初始化表的构造函数的定义格式为: 类名:构造函数(参数表):内嵌对象1(参数表1),内嵌对象2(参数表2), 构造函数体 组合类构造函数的执行顺序为: (1)按内嵌对象的声明顺序依次调用内嵌对象的构造函数。 (2)然后执行组合类本身的构造函数。,第4章 类与对象,例4.5 点类CPoint和线段类CLine,#include #include using namespace std; class CPoint public: CPoint(int x=0, int y=0) X=x; Y=y; cout “ CPoint
24、构造函数被调用“ endl; ; CPoint(CPoint ,第4章 类与对象,例4.5 点类CPoint和线段类CLine(续一),CPoint:CPoint(CPoint ,第4章 类与对象,例4.5 点类CPoint和线段类CLine(续二),CLine:CLine(CPoint ps, CPoint pe): start(ps), end(pe) cout “CLine 构造函数被调用“ endl; float CLine:GetDistance() double x = double (end.GetX() - start.GetX() ); double y = double (
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 教程 实验 指导 杨国兴类 对象
链接地址:https://www.31doc.com/p-3370367.html