面向对象的程序设计chapter3.ppt
《面向对象的程序设计chapter3.ppt》由会员分享,可在线阅读,更多相关《面向对象的程序设计chapter3.ppt(89页珍藏版)》请在三一办公上搜索。
1、1,第3章 类和对象,2,主要内容,类对象对象成员变量内部类static成员自引用对象指针this设计举例,GO,3,3.1 类,类的定义类是对具有相同属性和相同行为的客观世界的一组相似对象的抽象。类的定义形式为:class 类名 private:protected:public:;,类的作用域,4,3.1 类,类的定义访问权限关键字private-说明的成员只能在该类中使用,即在类的外面不能直接访问 private 成员,类的默认访问权限为private。public-说明的成员不但可以在该类中使用,而且其他的函数或类可以直接访问 public成员。protected-说明的成员可以在该类中
2、使用,也可以在其派生类中使用,但其他函数或类不能直接访问 protected 成员。,5,3.1 类,例如:,class FirstClass private:int x;/只能在 FirstClass类中使用 public:void set(int xx)x=xx;int get()return x;,6,3.1 类,例3.1 设计复数类,class Complex float real,imag;public:Complex(float x=0,float y=0)real=x;imag=y;Complex()Complex Add(Complex x)Complex z;z.real=r
3、eal+x.real;z.imag=imag+x.imag;return z;,7,3.1 类,成员变量成员变量的定义成员变量可用任何C+的基本数据类型、用户自定义数据类型、C+的基本类类型或用户自定义的类类型定义。成员变量定义不能递归,即不能用自身类的实例化对象作为该类的成员变量。如下定义类A是错误的:class A private:A x;,8,3.1 类,成员变量成员变量的初始化成员变量不能在定义时初始化,成员变量的初始化是在具体对象创建时由构造函数完成的。类的定义仅仅给出成员的类型,并不实际分配存储空间,只有创建了该类的一个实例(具体对象)后,才能为对象内部的成员分配空间。,9,3.1
4、 类,成员变量成员变量的初始化例如:class c private:int n=0;/error int rint=0;/error;,10,3.1 类,成员函数基本概念成员函数是声明在类内的一种函数,public访问权限的成员函数是一类对外部程序的公共接口。成员函数可以访问同一个类中的任何访问权限的成员变量,也可以调用同一个类中的任何访问权限的其他成员函数,但构造函数和析构函数除外。成员函数包括两种:构造函数和析构函数其它成员函数,11,3.1 类,成员函数成员函数的定义内联函数形式1class A 返回类型 成员函数名(形参表)函数体;;例如:,12,3.1 类,class Complex
5、 float real;float imag;public:Complex(float x=0,float y=0)real=x;imag=y;Complex()Complex Add(Complex x)Complex z;z.real=real+x.real;z.imag=imag+x.imag;return z;,13,3.1 类,成员函数成员函数的定义内联函数形式2class A 返回类型 成员函数名(形参表);inline 返回类型 类名:成员函数名(形参表)函数体;例如:,14,3.1 类,夺,class Complex float real;float imag;public:C
6、omplex(float x=0,float y=0)real=x;imag=y;Complex()Complex Add(Complex x);,inline Complex Complex:Add(Complex x),15,3.1 类,成员函数成员函数的定义外联函数形式:class A 返回类型 成员函数名(形参表);返回类型 类名:成员函数名(形参表)函数体;,16,3.1 类,成员函数成员函数重载基本概念成员函数重载就是允许多个功能类似的成员函数使用同一个函数名。当一个对象收到两个或多个相同消息时,则因调用成员函数时的参数个数或参数类型不同,而有不同的操作结果。,17,3.1 类,成
7、员函数成员函数重载成员函数重载的设计要求重载的多个成员函数之间参数个数或类型要有所不同。函数返回值类型不同不能作为重载依据。构造函数和所有成员函数都可以重载。,18,3.1 类,构造函数基本概念构造函数是一个特殊的成员函数,主要用于为对象分配空间。每当创建对象时,系统都自动调用构造函数,用来设置该对象的成员变量的初始数据值。,19,3.1 类,构造函数构造函数声明构造函数的访问权限一定是public。构造函数名一定要和类名相同。构造函数不能有返回类型,也不能是void类型。例如:,class Complex float real;float imag;public:Complex(float
8、x=0,float y=0)real=x;imag=y;,20,3.1 类,构造函数构造函数重载一个类中可以有多个参数个数或参数类型不同的构造函数。缺省参数的构造函数无参数或参数全为缺省值.例如:Complex();Complex(double r=0.0,double i=0.0);,21,3.1 类,构造函数构造函数重载带参构造函数参数中至少有一个不是缺省值.例如:Complex(double r,double i);,22,3.1 类,构造函数构造函数重载拷贝构造函数参数是一个已有初始化数值的对象。作用:将用作实参的对象的每一个成员变量的值都复制到新建的同类对象中。,23,3.1 类,构
9、造函数拷贝构造函数自定义拷贝构造函数一般形式为:classname(const classname&ob)例如:,class point int x,y;public:point(int a,int b)x=a;y=b;point(const point,24,3.1 类,构造函数拷贝构造函数缺省拷贝构造函数如果没有编写自定义的拷贝构造函数,C+会自动地将一个已存在的对象复制给新对象。例如:,class point int x,y;public:point(int a,int b)x=a;y=b;,point p1(30,40);point p2(p1);point p3=p1;,25,3.1
10、 类,构造函数拷贝构造函数系统提供默认拷贝构造函数的条件是不存在下列任意一种情况:类中有const成员;类中有引用类型成员;类或它的基类中有私有拷贝构造函数。,26,3.1 类,构造函数拷贝构造函数拷贝构造函数的特点拷贝构造函数名与类同名,不指定函数的返回值类型,具有一般构造函数的所有特性。拷贝构造函数只有一个参数,且是对某个对象的引用。每个类都必须有一个拷贝构造函数,如果类中没有定义拷贝构造函数,编译系统会自动生成一个缺省拷贝构造函数,作为该类的公有成员。,27,3.1 类,构造函数拷贝构造函数举例,class Date int day;public:Date(int d=0):day(d)
11、Date(Date,Date today(23);Date someDay;Date someDay2(today);,28,3.1 类,构造函数初始化表初始化表的格式成员变量名(初始值),成员变量名(初始值)其位置在构造函数头部的后面,中间用“:”与构造函数头部连接的部分称为初始化表。,29,3.1 类,构造函数初始化表为什么要使用初始化表?初始化只能在构造函数中进行,但对于常量类型(const)和引用类型(&)的成员变量以及对象成员,又不能在构造函数中用赋值语句直接赋值,因此C+提供了初始化表的置初值方式。,30,3.1 类,构造函数初始化表初始化表中成员变量的初始化顺序不论在初始化表中用
12、什么顺序初始化类的成员,编译器都会按成员在类定义时声明的顺序做初始化。所以初始化表的顺序实际不起作用,但打乱顺序会造成阅读和理解上的混淆。例如:,31,3.1 类,#include class A int x;int,void main()A a(10);a.print();,程序运行结果:x=10rx=10pi=3.14,32,3.1 类,析构函数基本概念在一个类中,也可以存在用new运算符动态申请内存空间的语句。这种内存空间是在外部程序创建对象的过程中动态进行的,系统无法知道其大小和具体地址,这些动态申请的内存空间也不会随着外部程序对象占用空间的释放而自动释放。析构函数是一个特殊的成员函数
13、,每当程序中创建的对象脱离其作用域时(例如对象所在的函数已调用完毕),系统将自动调用析构函数。析构函数一般用来做“清理善后”的工作,主要是完成动态申请内存空间的释放,以及其他一些扫尾工作。,33,3.1 类,析构函数析构函数的说明类名();析构函数不能带任何参数,不能有返回类型(void也不允许)。一个类中只能有一个析构函数。,34,3.1 类,析构函数注意事项如果类中用new运算符动态申请了内存空间,则该类的析构函数一定不能为空。此时,析构函数应该设计用delete运算符释放动态申请的内存空间。另外,凡是调用delete运算符时,系统也将自动调用析构函数。如果需要析构函数完成一些特殊的扫尾工
14、作,则这些工作可以在析构函数中完成。,35,3.1 类,析构函数例3.4 设计一个简单的动态数组类。,class Array double*arr;int size;public:Array(int sz=100);Array(void);;,36,3.1 类,Array:Array(int sz)if(sz=0)cout“参数错!”endl;exit(0);size=sz;arr=new doublesize;Array:Array(void)deletearr;void main()Array a(10);,37,3.1 类,const修饰符const修饰符的作用用const来定义变量,如
15、:const int maxsize=100;宏定义命令定义的常量的作用域是从定义处到文件结束,或到用宏定义命令#undef取消其定义时为止;用const定义变量可在文件内、函数内或块内。,38,3.1 类,const修饰符const修饰符的作用修饰成员函数参数当成员函数的某个参数修饰为const时,表示该参数在成员函数内不会,也不能被修改。修饰成员函数当const修饰成员函数时,关键字const通常放在成员函数定义的最后面,表示限制该成员函数只能读取而不能修改当前对象的成员变量。,39,3.2 对象,类与对象的关系在C+中,类是创建对象时的模板,对象是类的实际变量,也称为类的实例。对象是一个
16、引用类型,对象名是指向系统所分配内存空间首地址的引用(或别名)。例如:complex x(1,2);,40,3.2 对象,对象的定义利用构造函数创建对象有两种方法:()*=new()例如:创建复数类Complex的一个对象xComplex x(1,2);或 Complex*x=new Complex(1,2);,41,3.2 对象,const对象C+语言可以限定对象为const。const对象只能通过构造函数有一次初始化赋值。const Complex x(1,2);x.setReal(10);/errorx.setImage(20);/errorconst对象只能调用返回值类型限定为cons
17、t的公有成员函数,不能调用非const的成员函数。,42,3.2 对象,类成员的访问权限对对象操作的限制若某个类成员定义为public访问权限,则允许外部程序访问该成员。若某个类成员定义为private访问权限,则只允许该类本身的成员函数访问这些成员,即为类的封装或信息隐藏。例如:Complex x(1,2),y(3,4),z1,z2;z1=x.Add(y);x.real=10;/error,43,3.2 对象,类成员的访问权限对对象操作的限制外部程序对私有成员变量的访问通过设计相应的public成员函数来实现。例3.8 重新设计复数类。public:float getReal(void)co
18、nst;float getImag(void)const;void setReal(const float x);void setImag(const float y);通过set方法和get方法,可以增强对类中成员变量权限设置的灵活性。,44,3.2 对象,对象的种类对象按作用域不同可分为四种:全局对象在主程序执行之前构造。局部对象块对象动态对象执行运算符new时被创建;执行运算符delete时被撤消。,45,3.2 对象,对象的种类例:用new运算符创建Complex类的对象x,对象y。Complex*x=new Complex(1,2);Complex*y;y=new Complex(3
19、,4);,46,3.2 对象,对象的引用对象的引用是指对对象成员的引用,外部程序(外部函数)只能通过向该对象发消息才能访问该对象的公有成员变量和成员函数。一般引用格式如下:使用点运算符(.):对象名.成员Complex x(1,2);x.setReal(10);使用指针运算符(-):指向对象的指针-成员Complex*x=new Complex(1,2);Complex y(3,4),z;z=x-Add(y);,47,3.3 对象成员变量,对象模式中的整体-部分模式表示了一个整体对象概念是由若干个部分对象概念以某种方式组合构成的。用面向对象程序语言表达即先定义表示部分概念的类,再定义表示整体对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 chapter3
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5674290.html