面向对象程序设计语言C第章深入类与对象

上传人:无*** 文档编号:170241475 上传时间:2022-11-19 格式:PPT 页数:61 大小:887.52KB
收藏 版权申诉 举报 下载
面向对象程序设计语言C第章深入类与对象_第1页
第1页 / 共61页
面向对象程序设计语言C第章深入类与对象_第2页
第2页 / 共61页
面向对象程序设计语言C第章深入类与对象_第3页
第3页 / 共61页
资源描述:

《面向对象程序设计语言C第章深入类与对象》由会员分享,可在线阅读,更多相关《面向对象程序设计语言C第章深入类与对象(61页珍藏版)》请在装配图网上搜索。

1、面向对象程序设计语言C+电子科技大学计算机学院1第四章 深入类和对象 4.1 构造函数4.1.1 构造函数的作用构造函数的作用 class Date int day,month,year;public:void InitDate(int d,int m,int y);/初始化初始化?;程序员有的时候会忘记了调用初始化函数 或者调用了多次。这都是不好的现象。2第四章 深入类和对象4.1 构造函数4.1.1 构造函数的作用构造函数的作用 C+为类设计了构造函数(constructor)机制,它可以达到初始化数据成员的目的。类的构造函数是类的一个特殊成员函数,它没有返回类型(void也不行),可以有

2、参数,函数名和类名一样。当创建类的一个新对象时,自动调用构造函数,完成初始化工作(需要注意构造函数是否有参数,以及参数的个数、类型)。3第四章 深入类和对象4.1 构造函数4.1.1 构造函数的作用构造函数的作用构造函数的作用为:(1)分配一个对象的数据成员的存储空间;(该功能由系统自动完成。)(2)执行构造函数(体),一般是初始化一个对象的部分或全体数据成员。4第四章 深入类和对象 4.1 构造函数4.1.2 构造函数的定义构造函数的定义1.构造函数的定义class Date private:int year,month,day;public:Date(int y,int m,int d);

3、/其它成员;构造函数的参数可以是缺省的。5第四章 深入类和对象 4.1 构造函数4.1.2 构造函数的定义构造函数的定义2.构造函数的初始化方式构造函数有两种方式初始化数据成员:1)在构造函数体内用赋值语句的方式;Date:Date(int y,int m,int d)year=y;month=m;day=d;6第四章 深入类和对象4.1 构造函数4.1.2 构造函数的定义构造函数的定义2)构造函数的初始化列表的方式Date:Date(int y,int m,int d):year(y),month(m),day(d)7第四章 深入类和对象 4.1 构造函数4.1.2 构造函数的定义构造函数的

4、定义3.缺省的构造函数用户定义的类类型中,可以没有构造函数。编译器会自动给该类类型生成一个没有参数的构造函数,该函数不作任何初始化工作。这种构造函数称为缺省的构造函数。注意:一个类如果有显式定义的构造函数,编译器就不会生成缺省构造函数了。8第四章 深入类和对象 4.1 构造函数4.1.2 构造函数的定义构造函数的定义4.定义类对象时给构造函数提供参数1)仅仅只有一个参数:类名 对象名=参数;2)有一个或多个参数:类名 对象名(参数列表);9第四章 深入类和对象 4.1 构造函数4.1.3 重载构造函数重载构造函数一个类可以提供多个构造函数,用于在不同场合进行类对象的初始化工作。构造函数的重载,

5、它们的参数表必须互不相同。class Date int year,month,day;public:Date(int d,int m,int y);Date(int d,int m);Date(int d);Date();Date(const char*dateStr);10则下述定义对象的方式都是正确的。Date today(8,10,2008);Date day1(9,5);Date day2(8);Date Christmas(“Dec 25,2008”);Date now;第四章 深入类和对象 4.2 析构函数与构造函数对应的是析构函数。C+通过析构函数来处理对象的善后工作。析构函数没

6、有返回类型,没有参数,函数名是类名前加“”。析构函数的作用为:(1)执行析构函数(一般没有具体的工作);(2)释放对象的存储空间。(该功能由系统自动完成。)注意:析构函数需要负责释放new申请的空间。12第四章 深入类和对象4.2 析构函数 可以使用完全限定名方式显式地调用析构函数;若没有显式调用,则在一个对象的作用域结束时,系统自动调用析构函数。系统自动调用构造函数和自动调用析构函数的顺序是相反的。class Xpublic:X()X();(ex4-8.cpp)13 考虑一个数组,数组的大小在定义时初始化,而且其大小在运行时可以改变。class Array int*p;int size;pu

7、blic:Array(int num)size=num;p=new intsize;Array()delete p;.;第四章 深入类和对象4.3 拷贝构造函数1.什么是拷贝构造函数什么是拷贝构造函数 构造函数的参数可以是任何类型参数,甚至可以将自己类对象的(常量)引用作为参数,称它为拷贝构造函数。拷贝构造函数有两个含义:首先,它是一个构造函数,当创建一个新对象时,系统自动调用它;其次,它将一个已经定义过的对象(参数代表的对象)的数据成员逐一对应地拷贝给新对象。15第四章 深入类和对象 4.3 拷贝构造函数class A int x;int y;public:A(int,int);/一般构造函

8、数 A(const A&objA)/拷贝构造函数拷贝构造函数 x=objA.x;y=objA.y;/成员函数的实现16 void main()A obj1(10,20);/调用A(int,int)A obj2(obj1);/调用A(const A&);A obj3=obj2;/调用A(const A&);第四章 深入类和对象4.3 拷贝构造函数1.什么是拷贝构造函数什么是拷贝构造函数 如果一个类没有显式定义拷贝构造函数,C+编译器可以为该类产生一个缺省的拷贝构造函数。缺省的拷贝构造函数,也将拷贝对象的各个数据成员拷贝给被拷贝对象的各个数据成员。这样一来,两个对象的内存映像是一模一样的。18第四

9、章 深入类和对象4.3 拷贝构造函数2.拷贝构造函数的作用拷贝构造函数的作用拷贝构造函数的作用是:创建一个新对象,并将一个已存在的对象拷贝到这个新对象对象本身做参数(将实参对象拷贝给形参对象)函数返回对象(拷贝返回的对象给一个临时对象)(ex4-9.10.cpp)19class string int length;char*contents;int who;public:string(int id)length=0;contents=NULL;who=id;string fun(string arg)return(arg);void main()string s=1;string t=fun(

10、s);第四章 深入类和对象4.4 对象的创建、释放和初始化1.对象的创建和释放对象的创建和释放可以创建不同形式的各类对象:命名的自动对象 每次进入该对象的作用域,都调用构造函数;每次退出该对象的作用域,都调用析构函数。21第四章 深入类和对象 4.4 对象的创建、释放和初始化class Table;void f(int a)Table aa;/aa的生命期到f函数返回Table bb;/bb的生命期到f函数返回if(a0)Table cc;/cc的生命期到if语句结束 Table dd;/dd的生命期到f函数返回;/若调用函数f(10)则调用构造函数的顺序是:aa、bb、cc、dd;调用析构函

11、数的顺序是:cc、dd、bb、aa。22第四章 深入类和对象4.4 对象的创建、释放和初始化自由对象(动态对象)使用new创建对象(实际上调用构造函数),使用delete释放对象(实际上调用析构函数);当delete释放对象后,该对象就不能再被使用。如果构造函数有参数,也必须给出实参。(ex4-13.cpp)23注意 全局对象:在程序运行前,调用构造函数创建它们 整个程序结束时,调用析构函数释放它们第四章 深入类和对象 4.4 对象的创建、释放和初始化2.对象的初始化对象的初始化初始化有许多表示法,C+语言允许下述三种表示方法。C风格的初始值表的方法 赋值表达式的方法 表达式表的方法Class

12、_Name Object();Class_Name Object=;25第四章 深入类和对象4.5 对象和指针4.5.1 this指针指针 C+为所有非静态成员函数提供了一个称为this的指针,因此,常常称成员函数拥有this指针。this是一个隐含的指针,不能被显式声明 它只是一个形参,一个局部变量 在任何一个非静态成员函数里都存在 它局部于某一对象。this指针是一个常指针,可以表示为(但不能显式声明):X*const this;26第四章 深入类和对象4.5 对象和指针4.5.1 this指针指针 可以使用const说明符将this声明为指向常量的常指针。在类中,一个成员函数的原型后跟一

13、个const,该函数称为const成员函数,它的特点是该函数不能修改this所指的对象的成员。例 int GetInt()const;this 指针主要用在运算符重载、自引用等场合。(ex4-15.cpp)27class INT int num;public:void set(int x)num=x;void out()coutnum类的公有成员的方式在类外访问一个类的成员。(ex4-16.cpp)31第四章 深入类和对象4.5 对象和指针4.5.3 指向类的成员的指针指向类的成员的指针 C+语言中,可以说明指向类的数据成员的指针和指向类的成员函数的指针。这两种指针必须与对象或指向对象的指针结

14、合使用。32第四章 深入类和对象 4.5 对象和指针4.5.3 指向类的成员的指针指向类的成员的指针1.指向类的数据成员的指针指向类的数据成员的指针定义格式为:类型名 类名:*指针;这种说明不是说指针是属于类的而是说明指针只能指向指定类的指定类型的成员(ex4-17.cpp)33第四章 深入类和对象 4.5 对象和指针4.5.3 指向类的成员的指针指向类的成员的指针2.指向类的成员函数的指针指向类的成员函数的指针定义的格式为:类型名(类名:*指针)(参数表);函数指针并不属于类,而是只能指向类的指定原型的函数。(ex4-18.cpp)34第四章 深入类和对象4.6 友元关系 一个对象的私有数据

15、,只能通过成员函数进行访问,这是一堵不透明的墙。这种限制性的用法给两个类必须共享同一函数的情形带来了较大的开销。出于效率(而非技术上必须)考虑,C+提供了一种辅助手段,允许外面的类或函数去访问一个类的私有数据。35class INTEGER private:int num;public:void Set(int n)num=n;void Print(INTEGER obj)coutobj.num;/错误 why?void mian()INTEGER INTobj;INTobj.set(100);Print(INTobj);class INTEGER private:int num;public

16、:void Set(int n)num=n;friend void Print(INTEGER);void Print(INTEGER obj)coutobj.num;/okvoid mian()INTEGER INTobj;INTobj.set(100);Print(INTobj);类X的友元可以是一个函数(或是一个类)它不是X的成员函数,但能访问X的私有成员和保护段的成员,除了具有这一访问权限外 F在作用域、声明和定义等方面都是一普通的函数(或类)。第四章 深入类和对象4.6 友元关系4.6.1 友元函数 友元函数不属于类,友元函数没有this 指针 这是友元函数与成员函数的主要区别。友元

17、函数的声明可以放在类的任何段里。39第四章 深入类和对象4.6 友元关系4.6.2 友元类友元类class Printer;class INTEGER private:int num1;friend Printer;类Printer的成员函数全都是类INTEGER的友元友元函数;函数;可以访问类INTEGER的任何成员。40第四章 深入类和对象4.6 友元关系4.6.3 友元关系的总结友元关系的总结友元具有如下的特性:非传递性。即A是B的友元,B是C的友元,但A不一定是C的友元(除非将A声明 为C的友元);非对称性。即A是B的友元,但B不一定是A的友元(除非将B声明为A的友元)。41第四章 深

18、入类和对象4.7 与类和对象相关的问题4.7.1 对象数组对象数组 可以像创建任何其他数据类型的数组一样的方式来创建一个类的对象数组。创建对象数组,每个数组元素都是一个对象,所以需要多次调用构造函数;释放对象数组,也需要多次调用析构函数。One_Class_Name obj_array10;42第四章 深入类和对象4.7 与类和对象相关的问题4.7.1 对象数组对象数组 C+语言不允许初始化对象数组,所以,要创建一个类的对象数组,该类的构造函数必须满足下列三个条件之一:没有构造函数;有构造函数,但要有一个构造函数不带参数;有构造函数,但要有一个构造函数具有的参数全是缺省参数。(ex4-22.c

19、pp)43第四章 深入类和对象4.7 与类和对象相关的问题4.7.2 类类型做参数类型类类型做参数类型 由于类是一个数据类型,也可以将对象作为参数传递给函数 参数传递遵循传值(或传地址)的方式,这同所有其他的数据类型是相同的。类类型做形参类型,一般有3种方式:对象本身做参数(传值)对象引用做参数(传地址)对象指针做参数(传值)(ex4-23.cpp)44class OBJ int num;public:void set_num(int x)num=x;void out_num()coutnumout_num();objp-set_num(100);objp-out_num();void mai

20、n()OBJ obj;obj.set_num(10);fun(&obj);obj.out_num();结果为 10 100 100第四章 深入类和对象4.7 与类和对象相关的问题4.7.2 类类型做参数类型类类型做参数类型 对象本身做参数,对形参的任何修改都不影响用作实参的对象;对象引用做参数,对形参的任何修改就是对实参的对象的修改;对象指针做参数,对它指向的对象作任何修改就是对实参对象的修改。49第四章 深入类和对象 4.7 与类和对象相关的问题4.7.3 类类型常量类类型常量类类型常量的基本形式为:类名(常量表)(ex4-24.cpp)50第四章 深入类和对象4.7 与类和对象相关的问题4

21、.7.4 一个类的对象作为另一个类的成员一个类的对象作为另一个类的成员 一个类的对象可以作为另一个类的数据成员,简称为对象作为成员,实现的是整体和部分之间的关系(a part of),即对象的包含关系,有时也称为类之间的“复合”(composition)。可以通过 外部对象名.内部对象名.内部对象公有成员的方式来直接访问内部对象的公有成员。(ex4-25.cpp)51第四章 深入类和对象4.7 与类和对象相关的问题4.7.4 一个类的对象作为另一个类的成员一个类的对象作为另一个类的成员 一个复合类在构造的时候,首先调用的是内部类对象的构造函数。如果内部类对象多于一个,则它们的构造函数的调用顺序

22、依照它们的定义顺序。此后,再调用外部类的构造函数。而在复合类对象析构的时候,析构函数的调用顺序正好与构造是相反。52考虑点和圆的关系。圆的属性包括圆心和半径,而圆心就是一个点。class Point int x,y;public:Point(int x1,int y1)x=x1;y=y1;void setxy();class Circle float r;Point circle_point;public:Circle(float r1,int a,int b):circle_point(a,b)r=r1;void set_point()circle_point.setxy();void ma

23、in()Circle cobj(5.6,1,2);cobj.set_point();第四章 深入类和对象4.7 与类和对象相关的问题4.7.5 非局部环境非局部环境 在函数体外定义的变量(如全局变量、类中的静态成员等)称为非局部变量。它们在main函数执行前进行初始化(如果是对象,则在main函数执行前调用构造函数),在main函数执行结束时才释放对应的存储空间。55第四章 深入类和对象4.7 与类和对象相关的问题4.7.6 临时对象临时对象 当函数的返回类型为类类型时,将调用拷贝构造函数将返回的对象保存到那个临时对象中。另外,在类对象的运算中,也可能会产生临时对象。临时对象也可以由显示构造函

24、数的调用来创建。56 利用链表构造一个堆栈类Stack,定义在链表上的最小操作为插入(push)在链表前面增加一个项获取(pop)获取链表第一个项,并将之删除清除(clear)在链表中删除所有的项 class list;class node friend list;node*next;int item;class list node*head;/链表的头指针 int node_num;/链表中节点的个数 public:list()head=0;node_num=0;void push(int numb);int pop();void clear();list()clear();void list:push(int numb)node_num+;node*temp;temp=new node;temp-item=numb;temp-next=head;head=temp;int list:pop()if(head=0)coutitem;head=head-next;delete pnode;return numb;void list:clear()node_num=0;while(head)pop();

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!