ImageVerifierCode 换一换
格式:DOCX , 页数:59 ,大小:36.53KB ,
资源ID:8197950      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8197950.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于类和对象的进一步讨论.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

关于类和对象的进一步讨论.docx

1、关于类和对象的进一步讨论第3章 关于类和对象的进一步讨论请注意,这一章内容是C+的重点,要特别注意! 第2章我们介绍了关于类的一些基本内容,对于类对象的数据成员的初始化我们始终是通过建立成员函数来实现的。如:类Time就是通过set_time这个成员函数来实现的。而且一般都是用赋值语句给数据成员赋值,或通过cin来为数据成员从键盘输入值来实现。然后手工调用该函数对数据成员进行赋值的。/自编,这是一个由cin的输入或用赋值语句来为数据成员赋值的程序#includeusing namespace std;class Point int x, y;public: void set()cinxy; v

2、oid set(int x,int y)Point:x=x;Point:y=y; void print() cout(x, y)n; ;/=int main() Point a,b; a.set(); b.set(4,5); a.print(); b.print();/=那么在C+中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化数据成员呢?答案是肯定的。关于C+类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用。3.1 构造函数3.1.1 对象的初始化对象和变量一样,不赋初值是没有意义的。根据变量定义,全局变量和静态变量在定义(分配空间)时,初值为0,局部变量在定义时

3、才分配内存空间,其内容为随机数。对象定义和变量定义一样,当创建全局对象时如果没有初始化,初值为0,当创建局部对象时,如果没有初始化则以随机值表示对象。下面来看一个实例/自编,全局对象,局部对象在不赋初值情况下的输出#includeusing namespace std;/-class Point int x, y;public: void set(int a, int b) x=a, y=b; /- void print() cout(x, yxy; void print()const cout(x, y)n; ;/=如果一个类中所有的成员都是公有的,则与结构体一样是可以在定义对象时对数据成员

4、进行初始化。如:#includeusing namespace std;class Pointpublic: int x, y;int main() Point p=1,1; cout(p.x, p.y)n; return 0;/=因为对象中的数据成员一般都是私有的,不能随意改动,如果改成公有的破坏了封装性。C+建立和初始化对象的过程专门由该类的构造函数来完成。这个构造函数很特殊,只要对象建立,它马上被调用,给对象分配空间和初始化。如果一个类没有专门定义构造函数, 那么C+就仅仅创建对象而不做任何初始化。3.1.2 构造函数的作用C+规定与类同名的成员函数是构造函数,与其他成员函数不同的是它不

5、需用户来调用,在该类的对象创建时,会自动被调用。下面来看一个Desk类的定义class Desk int weight, height,width,length;public: Desk() /构造函数 weight=10; height=5; width=4; length=4; ;在类中定义的与类名相同的成员函数,并且没有任何返回类型的Desk()就是构造函数,这是一个无参数的构造函数,他在对象创建的时候自动调用,如果去掉Desk()函数体内的代码那么它和c+的默认提供的构造函数等价的。构造函数是没有返回类型的,函数体中也不允许返回值,但可以有无值返回语句return;。因为构造函数专门用

6、于创建对象和为其初始化,所以它不能随意被调用。没有返回类型,正显得它与众不同。例如,下面的代码是在类定义的外部定义一个构造函数,但是却错误地加上了返回类型:class Desk int weight, height,width,length;public: void Desk() /这样是错误的。构造函数不应有返回值,也不是无类型void函数。 weight=10; height=5; width=4; length=4; ;下面来看书中的例3.1/例3.1#includeusing namespace std;class Time int hour,minute,second;public:

7、 Time() /构造函数的定义,在类内定义,当然也可以在类外定义 hour=0;minute=0;second=0; void set_time(); /函数声明,在类外定义 void show_time(); /函数声明,在类外定义;void Time:set_time() cinhourminutesecond;void Time:show_time() couthour:minute:secondendl;int main() Time t1; t1.set_time(); t1.show_time(); Time t2; /会自动调用构造函数 t2.show_time();/*Tim

8、e t3;T3.Time();*/ /用户是不能调用构造函数的 return 0; 有关构造函数再一次说明如下:(1)构造函数是在建立对象时自动调用的。(2)构造函数没有返回值,即使是void也不行。(3)构造函数不需用户调用,也不能被用户调用。(4)构造函数并不公是对数据成员赋初值,也可以有其它的操作,但一般情况下构造函数不要有与初始化无关的内容。(5)用户没有定义构造函数,系统会自动生成一个构造函数,只是这个构造函数是空的,也没有参数,也没有初始化的操作。3.1.3 带参数的构造函数前面介绍的构造函数是无参的,不能完全满足初始化的要求。应该让构造函数可以带参数,否则,程序员只能先将对象构造

9、成千篇一律的对象值,甚至一个随机值对象,然后再调用一个初始化成员函数(set)将数据存到该对象中去。这样建立一个对象要调用两个成员函数才行,一个是构造函数,一个是set函数。如果采用带参数的构造函数,在调用不同对象的构造函数,可以将不同的数据传递给构造函数,以实现不同的初始化。构造函数的一般格式为:构造函数名(类型1 形参1,类型2 形参2,)下面的程序定义了一个带参数的Box类:/例3.2 有两个长方柱,其长宽高分别为(1)12,25,30;(2)15,30,21。分别求它佼的体积#includeusing namespace std;class Boxpublic: Box(int,int

10、,int); int volume();private: int height,width,length;Box:Box(int h,int w,int l) height=h;width=w;length=l;int Box:volume() return height*width*length;int main() Box box1(12,25,30); coutbox1.volume()endl;Box box2(15,30,21);coutbox2.volume()endl;可以看到,在建立对象时,实现了对不同的对象进行不同的初始化。下面我们将第2章中定义的类改成由构造函数来设置对象值

11、(学生课堂练习)#include#includeusing namespace std;/-class Date int year, month, day;public: Date(int y,int m,int d); bool isLeapYear(); void print();/-Date:Date(int y,int m,int d) year=y; month=m; day=d;/-bool Date:isLeapYear() return (year%4=0 & year%100!=0)|(year%400=0);/-void Date:print() coutsetfill(0

12、); coutsetw(4)year-setw(2)month-setw(2)dayn; coutisLeapYear() (*dp).print();/=创建对象如果不给出对象名,也就是直接以类名调用构造函数,则产生一个无名对象。无名对象经常在参数传递时用到。例如:coutDate(2003,12,23);,Date(2003,12,23)是一个无名对象,该对象在做完输出操作后便消失了。3.1.4 用参数初始化表对数据成员初始化在前面的实例中是在构造函数的函数体内通过赋值语句对数据成员实现初始化。C+还提供了另一种初始化数据成员的方法:参数初始化表。上例可改写为:Box:Box(int h,

13、int w,int l):height(h),width(w),length(l)这种写法方便、简练。3.1.5 构造函数的重载是函数就可以重载。构造函数也可以重载,还可以设置默认参数。/例3.3, 在上例的基础上,定义两个构造函数,其中一个无参数,一个有参数。#includeusing namespace std;class Boxpublic:Box(); /构造函数1,无参数的构造函数,称为默认构造函数。如果/用户不定义系统会自动提供一个无任何操作的默认构造函数。Box(int h,int w,int l):height(h),width(w),length(l) /构造函数2 ,有2个

14、参数 int volume();private: int height,width,length;Box:Box() height=0;width=0;length=0;int Box:volume() return height*width*length;int main() Box box1(12,25,30); coutbox1.volume()endl; Box box2; /注意:不能写成Box box2( );不能有括号。如果有括号的形式就是 /在声明一个普通函数,其返回类型为Box类型。 coutbox2.volume()endl;虽然可以有多个构造函数,但对于每一个对象来说,建

15、立对象时只执行一个构造函数,并非每个构造函数都执行。3.1.6 使用默认参数的构造函数 构造函数中参数的值也可以指定默认值。例如,下面的代码在创建对象时,将自动调用系统提供的默认构造函数。/例3.4 将上例中构造函数改用含默认值均为10.#includeusing namespace std;class Boxpublic: Box(int h=10,int w=10,int l=10):height(h),width(w),length(l) int volume();private: int height,width,length;int Box:volume() return heigh

16、t*width*length;int main() Box box1; coutbox1.volume()endl; Box box2(15); coutbox2.volume()endl; Box box3(15,20); coutbox3.volume()endl; Box box4(15,20,30); coutbox4.volume()endl; 在构造函数中使用默认参数是方便有效的,这相当于提供了多个重载的构造函数。说明:(1)构造函数的默认值要在声明中指定。(2)声明时可以省略形参名,如:Box(int=10,int=10,int=10);(3)当构造函数的参数全部指定为默认值时,

17、可以给出一个或多个参数,也可以不给参数,这时就不能再定义重载构造函数了。/补充实例#include#includeusing namespace std;/-class Date int year, month, day;public: Date(int y=2000,int m=1,int d=1); /构造函数1,有三个参数,设置默认参数 Date(const string& s); /构造函数2,有一个参数,无默认参数 bool isLeapYear()const; void print()const; ;/-Date:Date(int y,int m,int d) year=y; mo

18、nth=m; day=d;/-Date:Date(const string& s) year=atoi(s.substr(0,4).c_str(); /取出子串转换为字符串再转换为整型 month=atoi(s.substr(5,2).c_str(); day=atoi(s.substr(8,2).c_str();/-inline bool Date:isLeapYear()const return (year%4=0 & year%100!=0)|(year%400=0);/-inline void Date:print()const coutsetfill(0); coutsetw(4)y

19、ear-setw(2)month-setw(2)dayn; coutsetfill( );/-int main() Date c(2005-12-28); Date d(2003,12,6); Date e(2002); / 默认两个参数 Date f(2002,12); / 默认一个参数 Date g; / 默认三个参数,注意这里g后没有括号。表示无初始化的对象的定义 /如果有括号,表示是无参函数。 c.print(); d.print(); e.print(); f.print(); g.print();#includeusing namespace std;class Student/无

20、构造函数protected: char name20;void main() Student noName; /ok:noName的内容为随机值上例中的类定义等价于下面的类定义:#includeusing namespace std;class Studentpublic: Student() /一个空的无参构造函数protected: char name20;void main() Student noName;又例如,下面的代码定义了一个带参数的构造函数,面对创建无参对象,将不能正确地编译:#includeusing namespace std;class Studentpublic: S

21、tudent(char* pName) strncpy(name,pName,sizeof(name); protected: char name20;void main() Student noName;/error:无匹配的构造函数以上程序会出现如下的错误信息:error C2512: Student : no appropriate default constructor available如果增加一个无参的构造函数,就可解决这个问题:#includeusing namespace std;class Studentpublic: Student() Student(char* pNam

22、e) strncpy(name,pName,sizeof(name); protected: char name20;void main() Student noName; /正确的,有了匹配的构造函数 Student s(li);3.2 析构函数C+另有一种析构函数, 它也是类的成员函数,当对象撤消时,就会马上被调用,其作用是善后处理。例如,一张桌子要扔掉,须将桌子里面的东西拿出来,这些东西可能有用,不能随桌子一起扔。类似这些事就由析构函数来完成。析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用。析构函数不同于构造

23、函数,不可以有有参数,也不可以重载。作为一个类,可能有许多对象,每当对象生命期结束时,都要调用析构函数,每个对象一次。析构函数名,就在构造函数名前加上一个逻辑非运算符“”,表示“逆构造函数”。对象析构的顺序与对象创建的顺序正好相反。先构造的后析构,后构造的先析构。它相当于一个栈,先进后出。但并不是在任何情况下都是这一原则处理的。下面归纳一下什么时候调用构造函数和析构函数。 在一个函数中定义的对象,它是局部自动对象,则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。 全局对象,它的构造函数在文件中的所有函数(包括mai

24、n函数)执行之前调用。但如果一个程序有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序不确定。当main函数执行完毕或调用exit函数是(此时程序终止),调用析构函数。 静态局部对象则在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此与不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。 析构函数的作用是撤销对象占用的空间,而不是删除对象。 析构函数由于没有函数参数,所以不能重载。一个类可以有多个构造函数,但只能有一个析构函数。/例3.5 包含构造函数和析构函数的程序#include #include using namespace std;class Student public: Student(int n,string nam,char s) num=n; name=nam; sex=s; coutConstructor called.endl; Student() coutDestructor called.numendl; void display() coutnum:numendl; coutname:nameendl; coutsex:sexendlendl; private: int num; string name; char

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1