《第10章类与对象精.ppt》由会员分享,可在线阅读,更多相关《第10章类与对象精.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第10章类与对象第1页,本讲稿共48页程序设计基础程序设计基础世界的万事万物都是由对象构成的世界的万事万物都是由对象构成的!有形的东西有形的东西无形的东西无形的东西基本概念基本概念第2页,本讲稿共48页程序设计基础程序设计基础对象的两个方面对象的两个方面:(1)静态特征静态特征;(2)动态行为动态行为;例如例如:张三今年张三今年2828岁、男、岁、男、176cm176cm称为对象的称为对象的 attribute。例如例如:张三可以吃饭、骑车、跳舞等。张三可以吃饭、骑车、跳舞等。称为对象的称为对象的 operate。第3页,本讲稿共48页程序设计基础程序设计基础对象的分类(类的概念):对象的分类
2、(类的概念):把所有具有相同特征和行为的对象全部归为某个类。把所有具有相同特征和行为的对象全部归为某个类。例如例如:张三归为张三归为“人人”类。类。地球归为地球归为“行星行星”类。类。某个时刻归为某个时刻归为“时间时间”类。类。第4页,本讲稿共48页四大基本特征四大基本特征面向对象的特征面向对象的特征抽象特征:抽象特征:可以把对象分门别类,即通过类概括属于该类的一切对象。可以把对象分门别类,即通过类概括属于该类的一切对象。程序设计基础程序设计基础第5页,本讲稿共48页面向对象的特征面向对象的特征封装特征:封装特征:对象将自己的细节隐蔽起来,只向其他对象提供接口。对象将自己的细节隐蔽起来,只向其
3、他对象提供接口。程序设计基础程序设计基础第6页,本讲稿共48页面向对象的特征面向对象的特征继承特征:继承特征:一种类型的东西可以是来自于另外一种类型,即层次性。一种类型的东西可以是来自于另外一种类型,即层次性。动物动物植物植物生物生物程序设计基础程序设计基础第7页,本讲稿共48页面向对象的特征面向对象的特征多态特征:多态特征:发送同一消息,发生了不同的行为。发送同一消息,发生了不同的行为。程序设计基础程序设计基础比如:下课铃声响了第8页,本讲稿共48页定义类:对具有共同特性所有对象的抽象。类:对具有共同特性所有对象的抽象。狗狗重量重量体长体长叫叫跑跑属性属性:反映对象静态特征。操作操作:反映对
4、象动态行为。程序设计基础程序设计基础第9页,本讲稿共48页类:在类:在C+中是如何用代码来定义的呢?中是如何用代码来定义的呢?狗狗重量重量体长体长叫叫跑跑属性属性:反映对象静态特征。操作操作:反映对象动态行为。成员变量成员变量:int m_weight;int m_weight;int m_length;int m_length;成员函数成员函数:voidvoid shout();voidvoid run();程序设计基础程序设计基础第10页,本讲稿共48页也可用也可用struct,区别在于:如使用区别在于:如使用class关键字,关键字,类成员默认是类成员默认是私有私有的,如使用的,如使用s
5、truct关键字,关键字,类成员默认是类成员默认是公有公有的的。类的说明类的说明访访问问限限制制数据成员和成员函数数据成员和成员函数类名标识符类名标识符类名标识符类名标识符privateprivateprivateprivate:私有成员说明私有成员说明私有成员说明私有成员说明publicpublicpublicpublic:公有成员说明公有成员说明公有成员说明公有成员说明protectedprotectedprotectedprotected:保护成员说明保护成员说明保护成员说明保护成员说明 ;classclass程序设计基础程序设计基础第11页,本讲稿共48页class CDog publ
6、ic:void Run();void Shout();private:int m_weight;int m_length;不能对其进行赋初始值。不能对其进行赋初始值。int m_weight=30;程序设计基础程序设计基础第12页,本讲稿共48页成员函数定义形式:成员函数定义形式:1(1(类内声明,类内定义)类内声明,类内定义)返回类型返回类型 成员函数名成员函数名(形参表)(形参表)函数体函数体 class CDog public:void Shout(int m)coutm;private:int m_weight;int m_length;第13页,本讲稿共48页2(2(类内声明,类外定
7、义)类内声明,类外定义)域操作符域操作符返回类型返回类型 类名类名:成员函数名(形参表)成员函数名(形参表)函数体函数体 成员函数定义形式:成员函数定义形式:第14页,本讲稿共48页class CDog public:void Shout(int m);private:int m_weight;int m_length;void CDog:Shout(int m)cout-成员名;成员名;p-p-m_length;-指针操作符指针操作符 p-c1.p-c1.Shout(int m);/私有成员私有成员/私有成员私有成员第16页,本讲稿共48页访访问问限限制制publicprivateprote
8、cted能能被被类的对象类的对象访问访问也能也能被类本身的成员函数访问被类本身的成员函数访问不能不能被被类的对象类的对象访问访问能能被类本身的成员函数访问被类本身的成员函数访问不能不能被被类和对象类和对象访问访问能能被类及该类的派生类的成员函数访问被类及该类的派生类的成员函数访问第17页,本讲稿共48页class CDog public:void Run();void Shout();CDog();virtual CDog();private:int m_weight;int m_length;两个特殊的成员函数两个特殊的成员函数:函数名与类的名字是一样的函数名与类的名字是一样的这样的函数称为
9、这样的函数称为构造函数和析构构造函数和析构函数函数第18页,本讲稿共48页构造函数和析构函数构造函数和析构函数1 1 构造函数构造函数给对象一个标识符;给对象一个标识符;给对象开辟一个内存空间;给对象开辟一个内存空间;将对象中的将对象中的数据数据成员初始化。成员初始化。通过说明语句调通过说明语句调用用构造函数构造函数来实来实现现特征:特征:1.1.与类同名的成员函数与类同名的成员函数 2.2.无返回类型无返回类型 3.3.可重载可重载 4.4.如无定义,系统会自动生成缺省的构造函数如无定义,系统会自动生成缺省的构造函数 5.5.构造函数在创建对象时被系统自动调用构造函数在创建对象时被系统自动调
10、用第19页,本讲稿共48页#include class Circle public:Circle()x=y=r=5.0;Circle(double a,double b,double c)x=a;y=b;r=c;private:double x,y;double r;void main()Circle c1;Circle c2(2.1,3.3,6.0);第20页,本讲稿共48页默认构造函数默认构造函数调用时调用时不需要参数不需要参数的构造函数是默认构造函数,如的构造函数是默认构造函数,如类类Circle的第一个构造函数是默认构造函数的第一个构造函数是默认构造函数所有参数都是默认参数的构造函数是
11、默认构造函数所有参数都是默认参数的构造函数是默认构造函数Circle(double a=5.0,double b=5.0,double c=5.0)x=a;y=b;if(c0)r=c;else r=5.0;第21页,本讲稿共48页复制构造函数复制构造函数根据类的某个对象复制出一个内容完全相同根据类的某个对象复制出一个内容完全相同的新对象的构造函数叫复制构造函数的新对象的构造函数叫复制构造函数复制构造函数的参数是该类的对象(传引用复制构造函数的参数是该类的对象(传引用的方式)的方式)如果类定义时没有定义复制构造函数,编译如果类定义时没有定义复制构造函数,编译时会自动加入一个完成时会自动加入一个完
12、成数据成员复制数据成员复制的复制构的复制构造函数造函数发生情况:发生情况:1.=1.=定义变量时会发生。定义变量时会发生。2.2.将一个对将一个对象作为实参传递给一个非引用类型的形参。象作为实参传递给一个非引用类型的形参。3.3.从一个返回类型为非引用类型的函数返回一个从一个返回类型为非引用类型的函数返回一个对象。对象。4.4.用花括号列表初始化一个数组中的元用花括号列表初始化一个数组中的元素或一个聚合类中的成员。素或一个聚合类中的成员。第22页,本讲稿共48页#include class Circle public:Circle()x=y=r=5.0;Circle(double a,doub
13、le b,double c)x=a;y=b;r=c;Circle(Circle&c)x=c.x;y=c.y;r=c.r;private:double x,y;double r;void main()Circle c2(2.1,3.3,6.0);Circle c3(c2);第23页,本讲稿共48页2 2 析构函数析构函数析构函数任务:清理工作,如释放由构造函数分配的内存析构函数任务:清理工作,如释放由构造函数分配的内存等等特征:特征:1 1 与类同名,之前冠以波浪号,区别于构造函数;与类同名,之前冠以波浪号,区别于构造函数;2 2 不指定返回类型;不指定返回类型;3 3 不能指定参数。不能指定参
14、数。4 4 如无定义,系统会自动生成缺省的析构函数如无定义,系统会自动生成缺省的析构函数 5 5 在对象撤消时被自动调用在对象撤消时被自动调用第24页,本讲稿共48页#include class A public:A()cout“析构函数析构函数endl;void main()A a1;第25页,本讲稿共48页#include class A public:A()cout1111endl;A(A&m)cout5555endl;A()cout2222endl;void disp(A x)coutdisp函数函数endl;void main()A a1;disp(a1);如果改为如果改为?void
15、 disp(A&x)第26页,本讲稿共48页对象的类别:对象的类别:1 1局部对象局部对象 :对象定义时,对象被创建,当程序退出定义对象定义时,对象被创建,当程序退出定义该对象所在的函数体或程序块,对象被释放该对象所在的函数体或程序块,对象被释放2 2全局对象:全局对象:当程序开始运行时,对象被创建,当程序结束当程序开始运行时,对象被创建,当程序结束时,对象被释放时,对象被释放3 3静态对象:静态对象:当程序定义静态对象时,对象被创建,当程当程序定义静态对象时,对象被创建,当程序结束时,对象被释放序结束时,对象被释放4 4动态对象:动态对象:执行运算符执行运算符newnew时该对象被创建,执行
16、运算符时该对象被创建,执行运算符deletedelete时对象被释放时对象被释放第27页,本讲稿共48页#include#include using namespace std;class Cprivate:string name;public:C()name=anony;coutname constructn;C(const char*n)name=n;coutnameconstructn;C()coutname destructn;void main()C c0(hort );C c1;C c2(foo );coutn;C*ptr=new C();delete ptr;第28页,本讲稿共4
17、8页hort constructanony constructfoo constructfoo destructanony destructanony constructanony destructhort destruct第29页,本讲稿共48页对象成员的初始化对象成员的初始化 对象成员对象成员:在一个类中声明具有:在一个类中声明具有类类型类类型的数据成员的数据成员class A;class Cpublic:A a1;int m;第30页,本讲稿共48页 对对对象成员对象成员的构造函数的调用顺序取决于这些的构造函数的调用顺序取决于这些对对象成员象成员的的说明说明顺序,与它们在初始化列表中给出
18、的顺序,与它们在初始化列表中给出的顺序无关。顺序无关。当建立当建立X X类的对象时,先调用类的对象时,先调用对象成员对象成员的构造的构造函数,初始化对象成员,再执行函数,初始化对象成员,再执行X X类类的构造函数,的构造函数,初始化初始化X X类中的其它成员。类中的其它成员。先客人,后自己先客人,后自己 析构函数的调用顺序是先执行析构函数的调用顺序是先执行X X类类的析构函的析构函数,然后再调用数,然后再调用对象成员对象成员的析构函数。的析构函数。先自己,后客人先自己,后客人第31页,本讲稿共48页#include iostream.hclass Apublic:A()cout对象对象A的构造
19、函数的构造函数endl;A()cout对象对象A的构造函数的构造函数endl;class Cpublic:A a1;C()coutC的构造函数的构造函数endl;C()coutC的析构函数的析构函数endl;void main()C c1;第32页,本讲稿共48页对象成员的初始化对象成员的初始化 初始化列表的其他用途初始化列表的其他用途基本数据类型的数据成员也可用初始化列表做初始化基本数据类型的数据成员也可用初始化列表做初始化class C public:C(int i):number(i)C(int i)number=i;private:int number;第33页,本讲稿共48页 thi
20、sthis指针指针 一个类的多个对象各自拥有类的数据成员的一个副本一个类的多个对象各自拥有类的数据成员的一个副本类的成员函数则被其所有对象共享类的成员函数则被其所有对象共享一个类的不同对象响应相同的消息时,调用的是同一一个类的不同对象响应相同的消息时,调用的是同一个函数个函数问题:问题:成员函数如何知道它要操作哪个对象的数据?成员函数如何知道它要操作哪个对象的数据?第34页,本讲稿共48页每个对象都有一个每个对象都有一个指向自身的指向自身的thisthis指针指针对象调用成员函数时会将自己的对象调用成员函数时会将自己的thisthis指针传递给成员函指针传递给成员函数(隐含参数)数(隐含参数)
21、成员函数访问对象的所有数据成员都是通过成员函数访问对象的所有数据成员都是通过thisthis指针访问指针访问#include class Circle public:Circle()this-x=5.0;this-y=6.0;private:double x,y;第35页,本讲稿共48页成员函数访问数据成员可以直接访问,也可以通过成员函数访问数据成员可以直接访问,也可以通过thisthis指针访问指针访问实际上都是通过实际上都是通过thisthis指针指针thisthis指针的另外一个作用指针的另外一个作用访问对象自身访问对象自身(*thisthis)第36页,本讲稿共48页#include
22、class Test public:Test(int n=0);Test&setData(int n);int data;Test:Test(int n)data=n;Test&Test:setData(int n)data=n;return*this;void main()Test obj1,obj2;obj2=obj1.setData(100);coutobj2.dataendl;第37页,本讲稿共48页 const特性 对象应用的最低访问权原则对象应用的最低访问权原则有些对象不能被修改有些对象不能被修改让它不能被修改让它不能被修改有些成员函数不需要修改对象的数据成员有些成员函数不需要修改
23、对象的数据成员不让它修改数据成员不让它修改数据成员constconst对象对象不能被修改的对象不能被修改的对象constconst成员函数成员函数不能修改数据成员的成员不能修改数据成员的成员函数函数第38页,本讲稿共48页 const特性 声明声明constconst对象对象const Circle baseCircle(0,0,1);const Circle baseCircle(0,0,1);声明声明constconst成员函数成员函数void Test:print()void Test:print()const const coutdata=data!n;coutdata=data!n;
24、声明声明constconst数据成员数据成员和声明普通和声明普通constconst变量的方法相同(初始化方变量的方法相同(初始化方式不同)式不同)第39页,本讲稿共48页class CPublic:C()x=0;c=0;private:int x;const int c;/c是常量是常量class CPublic:C():c(0),x(-1)private:int x;const int c;第40页,本讲稿共48页constconst成员函数:将成员函数:将constconst写在函数头之后,函数体之前,说写在函数头之后,函数体之前,说明该函数是一个明该函数是一个constconst成员函
25、数。成员函数。2 常成员函数常成员函数常成员函数不能修改对象数据成员的值,常成员函数不能修改对象数据成员的值,是一种提高程序可靠性的安全机制。是一种提高程序可靠性的安全机制。第41页,本讲稿共48页 class Cpublic:void set(const string&n)name=n;n=word;void set(const char*n)name=n;const string&get()const name=“word”;return name;private:string name;/2 错误,错误,const成员函数,所有成员只读成员函数,所有成员只读 int main()C c1
26、;c1.set(hello);c1.get()=c+;coutc1.get()endl;return 0;/3 返回值是返回值是const型型的引用,只读的引用,只读/1 错误,因为错误,因为n被被const修饰,只读修饰,只读第42页,本讲稿共48页友元函数和友元类友元函数和友元类类的数据成员都设为私有的类的数据成员都设为私有的良好的程序设计风格良好的程序设计风格如果某个(些)外部函数需要直接访问类的数据成员,如果某个(些)外部函数需要直接访问类的数据成员,怎么办?怎么办?方法一:数据公有方法一:数据公有方法二:友元方法二:友元第43页,本讲稿共48页友元函数友元函数友元函数是一般函数或其它
27、类的成员函数友元函数是一般函数或其它类的成员函数友元函数具有访问类的所有成员的权限友元函数具有访问类的所有成员的权限声明友元函数的方法:声明友元函数的方法:friend+friend+函数原型函数原型除非能带来极大的便利,否则不要使用友元除非能带来极大的便利,否则不要使用友元 第44页,本讲稿共48页/类类VALUEVALUE中定义了一个友元函数中定义了一个友元函数set()set(),/注意注意set()set()不是该类的成员函数不是该类的成员函数class VALUE class VALUE public:public:friend void set(VALUE obj,int x);f
28、riend void set(VALUE obj,int x);private:private:int value;int value;void set(VALUE obj,int x)void set(VALUE obj,int x)obj.value=x;obj.value=x;/访问访问objobj的私有成员的私有成员 第45页,本讲稿共48页其他类的成员函数做友元其他类的成员函数做友元class Y public:void Yfunc();class X public:friend void Y:Yfunc();/把把Y Y类的类的YfuncYfunc函数声明为函数声明为X X类的友元
29、类的友元private:int k;void Y:Yfunc(X&obj)X obj;obj.k=100;/友元访问友元访问X的私有成员的私有成员第46页,本讲稿共48页友元类友元类一个类的友元类的一个类的友元类的所有成员函数所有成员函数都有访问类的都有访问类的所有成员的权限所有成员的权限友元类的声明方法:友元类的声明方法:friend+class+friend+class+类名类名友元类的声明是单方面的友元类的声明是单方面的第47页,本讲稿共48页另一个类做友元另一个类做友元class Y;class X public:friend Y;/把把Y Y类声明为类声明为X X类的友元,类的友元,private:int k;class Y public:void m_Yfunc(X&obj);void Y:m_Yfunc(X&obj)obj.k=100;/Y/Y类的成员函数是类的成员函数是X X的友元,可以的友元,可以 /访问访问X X的私有和受保护的成员的私有和受保护的成员 第48页,本讲稿共48页