《第10章类与对象精选PPT.ppt》由会员分享,可在线阅读,更多相关《第10章类与对象精选PPT.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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关键字,关键字,类成员默认是类成员默认是私有私有的
5、,如使用的,如使用struct关键字,关键字,类成员默认是类成员默认是公有公有的的。类的说明类的说明访访问问限限制制数据成员和成员函数数据成员和成员函数类名标识符类名标识符privateprivateprivateprivate:私有成员说明私有成员说明私有成员说明私有成员说明publicpublic:公有成员说明公有成员说明protectedprotected:保护成员说明保护成员说明保护成员说明保护成员说明 ;classclass程序设计基础程序设计基础第11页,此课件共48页哦class CDog public:void Run();void Shout();private:int m_
6、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页哦访访问问限限制制publicprivateprotected能能被被类的对象类的对象访问访问也能也能被类本身的成员函数访问被类
8、本身的成员函数访问不能不能被被类的对象类的对象访问访问能能被类本身的成员函数访问被类本身的成员函数访问不能不能被被类和对象类和对象访问访问能能被类及该类的派生类的成员函数访被类及该类的派生类的成员函数访问问第17页,此课件共48页哦class CDog public:void Run();void Shout();CDog();virtual CDog();private:int m_weight;int m_length;两个特殊的成员函数两个特殊的成员函数:函数名与类的名字是一样的函数名与类的名字是一样的这样的函数称为这样的函数称为构造函数和析构造函数和析构函数构函数第18页,此课件共48
9、页哦构造函数和析构函数构造函数和析构函数1 1 构造函数构造函数给对象一个标识符;给对象一个标识符;给对象开辟一个内存空间;给对象开辟一个内存空间;将对象中的将对象中的数据数据成员初始化。成员初始化。通过说明语句调用通过说明语句调用构造函数构造函数来实现来实现特征:特征:1.1.与类同名的成员函数与类同名的成员函数 2.2.无返回类型无返回类型 3.3.可重载可重载 4.4.如无定义,系统会自动生成缺省的构造函数如无定义,系统会自动生成缺省的构造函数 5.5.构造函数在创建对象时被系统自动调用构造函数在创建对象时被系统自动调用第19页,此课件共48页哦#include class Circle
10、 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的第一个构造函数是默认构造函数的第一个构造函数是默认构造函数所有参数都是默认参数的构造函数是默认构造函数所有参数都是默认参数的构造函数是默认构造函数Circl
11、e(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,double b,double c)x=a;y=b;r=c;Circl
13、e(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 不能指定参数。不能指定参数。4 4 如无定义,系统会自动生成缺省的析构函数如无定义,
14、系统会自动生成缺省的析构函数 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 disp(A&x)第26页,此课件共48页哦对象的类别
15、:对象的类别:1 1局部对象局部对象 :对象定义时,对象被创建,当程序退出定对象定义时,对象被创建,当程序退出定义该对象所在的函数体或程序块,对象被释放义该对象所在的函数体或程序块,对象被释放2 2全局对象:全局对象:当程序开始运行时,对象被创建,当程序结束时,当程序开始运行时,对象被创建,当程序结束时,对象被释放对象被释放3 3静态对象:静态对象:当程序定义静态对象时,对象被创建,当程序当程序定义静态对象时,对象被创建,当程序结束时,对象被释放结束时,对象被释放4 4动态对象:动态对象:执行运算符执行运算符newnew时该对象被创建,执行运算时该对象被创建,执行运算符符deletedelet
16、e时对象被释放时对象被释放第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页,此课件共48页哦hort constructanony con
17、structfoo 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的构造函数的构造函数endl;A()cout对象对
19、象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页哦 thisthis指针指针 一个类的多个对象各自
20、拥有类的数据成员的一个副一个类的多个对象各自拥有类的数据成员的一个副本本类的成员函数则被其所有对象共享类的成员函数则被其所有对象共享一个类的不同对象响应相同的消息时,调用的是同一个一个类的不同对象响应相同的消息时,调用的是同一个函数函数问题:问题:成员函数如何知道它要操作哪个对象的数据?成员函数如何知道它要操作哪个对象的数据?第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 class Test public
22、: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;声明声明constconst数
24、据成员数据成员和声明普通和声明普通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成员函数。成员函数。2 常成员函
25、数常成员函数常成员函数不能修改对象数据成员的值,常成员函数不能修改对象数据成员的值,是一种提高程序可靠性的安全机制。是一种提高程序可靠性的安全机制。第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;c1.set(hell
26、o);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);friend voi
28、d 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类的友元类的友元priv
29、ate: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页哦
限制150内