类和对象(一).

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章类和对象(一)3.1类的构成3.1.1从结构到类例3.1有关日期结构的例子。#includeiostream.hstructDate{intyear;intmonth;intday;};main(){Datedate1;date1.year=2003;date1.month=8;date1.day=25;coutdate1.year.date1.month.date1.dayendl;return0;}3.1.2类的构成类声明的一般格式如下::class类名{public:公有数据成员;公有成员函数;protected:保护数据成员;保护成员函数;private:私有数据成员;私有成员函数;};用一个类来描述日期,其形式如下:classDate{public:voidsetDate(inty,intm,intd);voidshowDate();private:intyear;intmonth;intday;};3.2成员函数的声明成员函数的声明通常采用以下两种方式:(1)将成员函数以普通函数的形式进行说明,这种成员函数在类外定义的一般形式是:返回类型类名∷成员函数名(参数表){//函数体}例如,以下是表示坐标点的类Coord的声明。classCoord{public:voidsetCoord(int,int);//设置坐标点intgetx();//取x坐标点intgety();//取y坐标点private:intx,y;};voidCoord∷setCoord(inta,intb){x=a;y=b;}intCoord::getx(){returnx;}intCoord::gety(){returny;}(2)将成员函数以内联函数的形式进行说明。在C++中,可以用下面两种格式将成员函数声明为类的内联函数:①隐式声明直接将函数声明在类内部。例如:classCoord{public:voidsetCoord(inta,intb){x=a;y=b;}intgetx(){returnx;}intgety(){retruny;}private:intx,y;};②显式声明这种成员函数在类外定义的一般形式是:inline返回类型类名::成员函数名(参数表){//函数体}例如上面的例子改为显式声明可变成如下形式:classCoord{public:voidsetCoord(int,int);intgetx();intgety();private:intx,y;};inlinevoidCoord::setCoord(inta,intb){x=a;y=b;}inlineintCoord::getx(){returnx;}inlineintCoord::gety(){returny;}3.3对象的定义和使用3.3.1类与对象的关系通常我们把具有共同属性和行为的事物所构成的集合叫做类。在C++中,可以把相同数据结构和相同操作集的对象看成属于同一类。3.3.2对象的定义(1)在声明类的同时,直接定义对象,即在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如:classCoord{public:voidsetCoord(int,int);intgetx();intgety();private:intx,y;}op1,op2;(2)声明了类之后,在使用时再定义对象,定义的格式与一般变量的定义格式相同,例如:classCoord{//…};//…main(){Coordop1,op2;//…}3.3.3对象中成员的访问在类的外部可以通过类的对象进行访问,访问的一般形式是:对象名.数据成员名或对象名.成员函数名(参数表)其中“.”叫做对象选择符,简称点运算符。例3.2使用类Coord的完整程序。#includeiostream.hclassCoord{public:voidsetCoord(inta,intb){x=a;y=b;}intgetx(){returnx;}intgety(){returny;}private:intx,y;};voidmain(){Coordop1;inti,j;op1.setCoord(5,6);//调用op1的setCoord(),初始化对象op1i=op1.getx();//调用op1的getx(),取op1的x值j=op1.gety();//调用op1的gety(),取op1的y值coutop1i=iop1j=jendl;}3.3.4类成员的访问属性类成员有三种访问属性:公有(public)、私有(private)和保护(protected)。•说明为公有的成员不但可以被类中成员函数访问;还可在类的外部,通过类的对象进行访问。•说明为私有的成员只能被类中成员函数访问,不能在类的外部,通过类的对象进行访问。•说明为保护的成员除了类本身的成员函数可以访问外,该类的派生类的成员也可以访问,但不能在类的外部,通过类的对象进行访问。3.3.5对象赋值语句例3.5用对象赋值语句的例子。#includeiostream.hclassabc{public:voidinit(inti,intj){a=i;b=j;}voidshow(){coutabendl;}private:Inta,b;};main(){abco1,o2;o1.init(12,34);o2=o1;//将对象o1数据成员的值赋给对象o2o1.show();o2.show();return0;}3.3.6类的作用域所谓类的作用域就是指在类声明中的一对花括号所形成的作用域。一个类的所有成员都在该类的作用域内,一个类的任何成员可以访问该类的其他成员。而在类的外部,对该类的数据成员和成员函数的访问则要受到一定的限制,有时甚至是不允许的,这体现了类的封装功能。例3.6理解类的作用域。#includeiostream.hclassmyclass{public:inti;voidinit(int);voidshow(){cout“i=”iendl;}//可以访问类中的数据成员i};voidmyclass::init(intsi){i=si;}//可以访问类中的数据成员iintfun(){returni;}//非法,不能直接访问类中的ivoidmain(){myclassob;ob.init(5);//给数据成员i赋初值5ob.show();i=8;//非法,不能直接访问类中的i,可改写成ob.i=8ob.show();}3.4构造函数与析构函数构造函数和析构函数都是类的成员函数,但它们都是特殊的成员函数,执行特殊的功能,不用调用便自动执行,而且这些函数的名字与类的名字有关。3.4.1构造函数构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数具有一些特殊的性质:(1)构造函数的名字必须与类名相同。(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。(5)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被调用的。例3.7为类Date建立一个构造函数。#includeiostream.hclassDate{public:Date(inty,intm,intd);//构造函数voidsetDate(inty,intm,intd);voidshowDate();private:intyear,month,day;};Date::Date(inty,intm,intd)//构造函数的实现{year=y;month=m;day=d;}voidDate::setDate(inty,intm,intd){year=y;month=m;day=d;}inlinevoidDate::showDate(){coutyear.month.dayendl;}通常,利用构造函数创建对象有以下二种方法:(1)利用构造函数直接创建对象.其一般形式为:类名对象名[(实参表)];这里的“类名”与构造函数名相同,“实参表”是为构造函数提供的实际参数。例3.8利用构造函数直接创建对象。#includeiostream.hclassDate{//省略,同例3.7};//省略,同例3.7voidmain(){Datedate1(1998,4,28);//定义类Date的对象date1,//自动调用date1的构造函数,初始化对象date1coutDate1output1:endl;date1.showDate();//调用date1的showDate(),显示date1的数据date1.SetDate(2002,11,14);//调用date1的setDate(),//重新设置date1的数据coutDate1output2:endl;date1.showDate();//调用date1的showDate(),显示date1的数据}(2)利用构造函数创建对象时,通过指针和new来实现。其一般语法形式为:类名*指针变量=new类名[(实参表)];例如:Date*date1=newDate(1998,4,28);就创建了对象(*date1)。将例3.8的主函数改成用这种方法来实现,其运行结果与原例题完全相同。voidmain(){Date*date1;date1=newDate(1998,4,28);//以上两条语句可合写成:Date*date1=newDate(1998,4,28);coutDate1output1:endl;date1-showDate();date1-setDate(2002,11,14);coutDate1output2:endl;date1-showDate();deletedate1;}3.4.2成员初始化表带有成员初始化表的构造函数的一般形式如下:类名::构造函数名([参数表])[:(成员初始化表)]{//构造函数体}成员初始化表的一般形式为:数据成员名1(初始值1),数据成员名2(初始值2),……例3.9成员初始化表的使用。#includeiostream.hclassA{public:A(intx1):x(x1),rx(x),pi(3.14)//rx(x)相当于rx=x,{}//pi(3.14)相当于pi=3.14voidprint(){coutx=xrx=rxpi=pi;}private:intx;int℞constfloatpi;};main(){Aa(10);a.print();return0;}3.4.3缺省参数的构造函数例3.11#includeiostream.hclassCoord{public:Coord(inta=0,intb=0){x=a;y=b;}//带有缺省参数的构造函数intgetx(){returnx;}intgety(){returny;}private:intx,y;};voidmain(){Coordop1(5,6);Coordop2(5);Coordop3;inti,j;i=op1.getx();j=op1.gety();coutop1i=iop1j=jendl;i=op2.getx();j=op2.gety();coutop2i=iop2j=jendl;i=op3.getx();j=op3.gety();coutop3i=iop3j=jendl;}3.4.4析构函数析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:①析构函数与构造

1 / 45
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功