大一下大机一2类与对象_第1页
大一下大机一2类与对象_第2页
大一下大机一2类与对象_第3页
大一下大机一2类与对象_第4页
大一下大机一2类与对象_第5页
免费预览已结束,剩余32页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+程序设计第2章 类与对象本章主要内容结构体与类类的定义方法C+类成员的访问属性类和对象的简单应用举例构造函数与析构函数对象指针类的概念:C+中的类就是一种用户自定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数,它们分别叫做类的数据成员和类的函数成员。定义性说明和引用性说明,定义性说明就是定义类,说明了类的成员。而引用性说明就是只说明了类名,留待后面的代码对这个类加以定义。 2.1类的声明和对象的定义一、结构体与类结构体struct Studentint num; char name20; float score3; ;C+中允许用stru

2、ct来定义一个类类型Student 是一个合法的类类型一个完整的类定义包括关键字class 类名 类体 在类体中定义类的属性(类中的数据成员的取值范围)和操作(类中的成员函数名)。class 类名 public: 若干成员; protected: 若干成员; private: 若干成员; ;二、类的定义类成员访问限定符public的成员:一般是成员函数,用于定义类的外部接口,在程序中的任何部分都可访问。private的成员:一般是数据成员,用于描述类的属性,它们只能被类自身的成员函数访问,类的成员默认情况下是私有的。protected的成员:不能被类外访问,但可被派生类的成员函数访问。注意:

3、关键字 private public protected的出现顺序是任意的,并且可以不出现或出现多次。但类中的每个成员只能有一种特定的访问属性Class Cylinder public : void setcylinder(double r,double h); double getradius(); double getheight(); double volume(); double surface_area(); private: double radius; double height;注:在类内不允许对声明的数据成员进行初始化举例类是用户定义的一种类型,在程序中我们根据该类的类型说明

4、一个变量,那么这个变量就是一个对象,它是具体的,在内存中对象被分配相应的内存,它是以类作为样板生成的。事实上建立对象时,只有每个对象的数据是分别占用内存的,而操作这些数据的代码(函数)只有一份,由各对象共享,这是编译器实现对象的一种方法而已,我们仍应理解为一个对象是独立的由数据和代码组成。三、类和对象的定义 与一般变量相同,对象也必须经过声明后才能使用,声明类的对象如下: 类名 对象名;例如:Cylinder cylinder1,cylinder2;Cylinder cylinder10;对象的声明:定义类的成员函数的实现的一般形式为: 返回类型 类名:成员函数名(参数说明) 函数体 “:”是

5、作用域运算符,它标明所要定义的函数属于哪个类注:1、如果函数体的定义放在类的声明内,这样定义的函 数自动成为内联函数 2、如果在类外定义一个类的内联成员函数,应该在函 数类型之前用关键字inline进行说明 四、类的成员函数的定义 void Cylinder:setcylinder(double r,double h) radius=r;height=h; double Cylinder:getradius() return radius; double Cylinder:getheight() return height; double Cylinder:volume() double vo

6、l; vol=3.1415926*radius*radius*height; return vol;例2.12.2 C+类成员的访问控制 引用方式 (1)对象名.数据成员名 、对象名.成员函数名(参数表) (2) 指向该类对象的指针-成员名 (3)对象的引用.成员名 在C+中,数据封装是通过类来实现的。由于类中成员指定了访问权限,所以程序中其他函数就不能访问对象的私有成员,只能通过公有成员提供接口来访问 class A public: int x; setX(int a) x=a; getX() return x; ; A object; object.x=5;类的数据成员可以是类类型,也就是

7、说类的声明中数据成员可以是另一个类的对象,但必须注意以下两点: 这个对象不能是本类的对象。 作为数据成员的对象所属的类,应该在声明这个对象之前进行声明class A . ;class B A a; .;2.3类和对象的简单应用举例例2.2求三个长方体的体积。编写一个基于对象的程序,数据成员包括length、width、height。要求用成员函数实现以下功能:由键盘分别输入三个长方体的长,宽,高;计算长方体的体积;输出长方体的体积;int rectangle: calculate() return (length*width*heigth);void rectangle:output()cou

8、tcalculate(); int main()rectangle t1; t1.input(); t1.calculate(); t1. output(); return 0;#include using namespace std;class rectangle public: void input(); void output(); int calculate(); private: int length; int width; int heigth;void rectangle:input() cinlength; cinwidth; cinheigth;2.4构造函数与析构函数一、构

9、造函数对象的初始化 将确定对象的初始状态,即对其成员的初始值进行确定。类的数据成员不能在声明类时初始化如果类中成员全部是public,可在定义对象时对数据成员进行初始化C+提供了构造函数(constructor)来处理对象的初始化问题构造函数举例例2.3void Time :show_time()couthour“:”minute“:”secendl;int main() Time t1; t1. set_time(); t1. show_time(); Time t2; t2. show_time(); return 0;#include using namespace std;class

10、Time public: Time() hour=0; minute=0; sec=0; void set_time(); void show_time(); private: int hour; int minute; int sec;void Time:set_time() cinhour; cinminute; cinsec;1、构造函数的定义构造函数的函数名必须与类名相同。 是一个很特殊的成员函数,因此构造函数需要在类中说明(定义) ;构造函数没有返回值,也不需在定义时声明函数类型。构造函数的主要作用是完成对类对象的初始化工作。构造函数不能由编程人员显式的直接调用。在构造函数的函数体中

11、不仅可以对数据成员赋初值,而且可以包含其他语句。在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。2、带参数的构造函数采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。构造函数首部的一般格式为构造函数名(类型 1 形参1,类型2 形参2,)实参是在定义对象时给出的。定义对象的一般格式为 类名 对象名(实参1,实参2,);带参数的构造函数举例例2.4int Box:volume() return (height*width*length);int main()Box box1(12,25,30); coutthe vol

12、ume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of box2 is box2.volume()endl; return 0;#include using namespace std;class Box public: Box(int,int,int); int volume(); private: int height; int width; int length;Box:Box(int h,int w,int len) height=h; width=w; length=len;3、用参数初始化表对数据成

13、员初始化C+还提供另一种初始化数据成员的方法参数初始化表来实现对数据成员的初始化。在原来函数首部的末尾加一个冒号,然后列出参数的初始化表这种写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。 举例例2.5int Box:volume() return (height*width*length);int main()Box box1(12,25,30); coutthe volume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of box2 is box2.volume()endl; return 0

14、;#include using namespace std;class Box public: Box(int h,int w,int len):height(h),width(w),length(len) int volume(); private: int height; int width; int length;4、构造函数的重载 在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。int Box:volume() return (height*width*length);in

15、t main()Box box1; coutthe volume of box1 is box1.volume()endl;Box box2(15,30,21);coutthe volume of box2 is box2.volume()endl; return 0;#include class Box public: Box(int h,int w,int len):height(h),width(w),length(len) Box(); int volume(); private: int height; int width; int length;Box:Box() height=1

16、0; width=10; length=10;说明:调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。5、使用默认参数的构造函数构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。说明:(1) 应该在声明构造函数时指定默认值。(2) 如

17、果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。(3) 在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。int Box:volume() return (height*width*length);int main()Box box1; coutthe volume of box1 is box1.volume()endl;Box box2(15);coutthe volume of box2 is box2.volume()endl;Box box3(15,30);coutthe volume of box2 is box3.vol

18、ume()endl; return 0;#include class Box public: Box(int h=10,int w=10,int len=10); int volume(); private: int height; int width; int length;Box:Box(int h,int w,int len) height=h; width=w; length=len;6、构造函数小结如构造函数带有参数, 在声明对象时,就必须利用实参对对象进行初始化。如构造函数不带参数,定义对象时不能带括号。与普通函数一样,构造函数也可以定义为内联函数,可以带默认形参值,也可以重载。注

19、:当类中没有声明构造函数时,系统会为之生成一个不带参数的构造函数,该函数体内没有任何语句,不执行任何操作。二、析构函数析构函数:和构造函数作用相反的成员函数。函数首:类名()主要功能:释放对象的内存资源。析构函数的作用并不仅限于释放资源方面,它还可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。析构函数无返回值、无函数类型、无参数。一个类可以有多个构造函数,但只能有一个析构函数系统调用构造和析构函数的顺序:先构造的后析构,后构造的先析构析构函数调用的条件如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。static局部对象在函数

20、调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。2.5对象指针一、指向对象的指针:存放对象指针的指针变量定义形式:类名 *对象指针名; 例:Box *p,box1; p=&box1;通过对象指针访问对象成员 例:*p box1 (*p).width box1.width p-width (*p)

温馨提示

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

评论

0/150

提交评论