《计算机网络原理》第4章类和对象-精选课件_第1页
《计算机网络原理》第4章类和对象-精选课件_第2页
《计算机网络原理》第4章类和对象-精选课件_第3页
《计算机网络原理》第4章类和对象-精选课件_第4页
《计算机网络原理》第4章类和对象-精选课件_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第四章类和对象C++本章主要内容类及其实例化构造函数析构函数this指针类和对象的性质面向对象的标记图

类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起,使类中的数据得到很好的“保护”.

类是具有相同属性和行为的一组对象的集合,为属于该类的全部对象提供了统一的抽象描述.1.类的定义

类的定义格式:class类名{private:

成员数据;

成员函数;

public:

成员数据;

成员函数;

protected:

成员数据;

成员函数;};关键字类名私有公有保护classStudent{private:intnum;charname[20];charsex; public:voidStudent::display(){ cout<<“num:”<<num<<endl; cout<<“name:”<<name<<endl; cout<<“sex:”<<sex

<<endl;}};分号不能少类的定义private限定用关键字private限定的成员称为私有成员,对私有成员限定在该类的内部使用,即只允许该类中的成员函数使用私有的成员数据,对于私有的成员函数,只能被该类内的成员函数调用;类就相当于私有成员的作用域.

类的定义public限定用关键字public限定的成员称为公有成员,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的.类的定义protected限定用关键字protected所限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数.即保护成员的作用域是该类及该类的派生类.类的定义私有成员公有成员保护成员类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用私有函数公有函数保护函数类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用类的定义每一个限制词(private等)在类体中可使用多次.一旦使用了限制词,该限制词一直有效,直到下一个限制词开始为止.如果未加说明,类中成员默认的访问权限是private,即私有的.类的定义类的定义成员函数:用于对数据成员进行操作返回类型类名::成员函数名(参数列表){

函数体}voidPoint::Setxy(inta,intb){ x=a; y=b;}注意:“::”表示该成员函数属于这个特定的类类的定义数据成员的赋值 数据成员是用于描述对象的属性,只有产生了具体的对象才有意义,可以在实例化对象的同时,通过构造函数对数据成员进行初始化,也可以通过对象进行赋值.2.对象定义了一个类后,不能对类的成员进行操作,要使用类必须先声明类的对象,即对该类进行实例化.类的对象是具有该类类型的某一实例. 如果将类看作是自定义的类型,那么类的对象可看成是该类型的变量.对象类和对象的关系 类是对象的抽象,而对象是类的具体实例.

类是抽象的,不占用内存,而对象是具体的,占用内存的.

对象对象的定义格式:

<类名><对象名>;例如:

PointA; Point*p=&A; Point&R=b;对象对象成员的表示方法1、一般对象数据成员:

<对象名>.<成员名>成员函数:

<对象名>.<成员名>(<参数表>)A.x=20;//只有被修饰为public的成员才可这样访问A.Setxy(12,25);2、引用对象与此相同对象3、指针对象数据成员:

<对象名>-><成员名>成员函数:

<对象名>-><成员名>(<参数表>)p->x=20;//只有被修饰为public的成员才可这样访问

//等价于*p.x=20;p->Setxy(12,25); //等价于*p.Setxy(12,25);3.构造函数构造函数是类中一种特殊的成员函数,主要用来在创建对象时为对象申请存储空间,并为数据成员进行初始化的操作.构造函数的名字与它所属的类名相同,跟其他成员函数一样,构造函数可以在类的内部定义,也可以在类的外部定义.定义构造函数时,利用参数传递来实现对被创建对象中的数据成员赋值,由于构造函数是在创建对象时执行的,所以对数据成员的赋值一般都是初始值.当然,构造函数也可以不带参数.构造函数构造函数的特殊性语法上,构造函数名与类名必须相同,且不能有返回类型(也意味着无返回值),除此之外与普通方法相同,如可以有参数列表、可以重载和设置参数的缺省值等.构造函数在生成对象时由系统自动调用.构造函数必须是公有的,否则系统也无法在构造对象时调用它.构造函数缺省的构造函数

在C++中,每个类必须有构造函数,否则不能生成类的对象.

如果用户没有定义,则系统自动生成一个构造函数,称为缺省构造函数.

缺省构造函数没有任何参数,形式为:类名();

需要特别注意的是,只要用户自己定义了一个构造函数,无论有无参数,系统将不再提供缺省构造函数.构造函数构造函数原型声明 类名(形参列表);

Point(); Point(int,int);构造函数声明时定义类名::类名(形参列表);Point::Point():x(0),y(0);Point::Point(inta,intb):x(a),y(b);//等同于如下定义Point::Point(inta,intb){x=a;y=b;}创建对象时调用构造函数

PointA; PointB(10,20); x,y的值分别是?#include<iostream>#include<string>usingnamespacestd;classpoint{private: intx,y;public:point();point(int,int);voiddisplay(){cout<<x<<y;}};point::point():x(0),y(0){cout<<"abc"<<endl;}point::point(inta,intb):x(a),y(b){cout<<a<<b<<endl;}voidmain(){pointa;a.display();}构造函数构造函数与new运算符

new用于创建动态的对象,返回该对象的指针,可与构造函数一起使用

Point*p=newPoint;//调用无参构造函数

Point*p=newPoint(20,30);//调用有参构造函数构造函数构造函数的默认参数 若既要定义有参的构造函数,同时又要定义无参的构造函数,可只定义一个带有默认参数的构造函数即可. 函数原型,指定默认值

Point(int=0,int=0);

函数定义

Point::Point(inta,intb):x(a),y(b);创建对象时调用构造函数

PointA; PointB(10,20); x,y的值分别是?构造函数复制构造函数又叫拷贝构造函数是一种特殊的构造函数,其名称与类名称相同.用类定义对象中,可用拷贝功能的构造函数将另一个已经存在对象的数据拷贝到新建的对象中.用一个已知的对象来初始化一个被创建的同类对象拷贝构造函数的特征:拷贝构造函数除了具有一般构造函数的特征外,其形参必须是本类的对象的引用.只有一个参数,是对某个对象的引用构造函数如果用户没有声明类的拷贝构造函数,系统会自动生成一个缺省的拷贝构造函数,这个缺省的拷贝构造函数的功能是把初始化对象的每个数据成员的值都复制到新建的对象中,也可以说是同类对象的克隆.拷贝构造函数的格式 类名::类名(类名&对象名) {

函数体;

} Location::Location(Location&t){ x=t.x; y=t.y; }构造函数拷贝构造函数被调用的三种情况. ①用类的对象去初始化类的另一个对象的时候.

voidmain(void){ LocationA(1,2);

LocationB(A);

cout<<B.GetX()<<endl;

}

构造函数 ②如果函数的形参是类的对象,调用该函数进行形参和实参结合的时候.

voidfun(LocationP){ cout<<p.GetX()<<endl;

} voidmain(){ LocationA(1,2);

fun(A);

}构造函数 ③函数的返值是类的对象,函数调用完成返回的时候.

Locationfun(){ LocationA(1,2);

returnA;

} voidmain(){ LocationB;

B=fun();

}4.析构函数析构函数与构造函数的作用几乎正好相反,它用来释放对象,完成对象被删除前的一些清理工作.析构函数也是类的一个公有函数成员.和构造函数一样,析构函数必须与该类同名称,它的名称由类名前面加“~”构成,析构函数的其他性质如同构造函数,不能有返回值,不允许声明返回值类型.特别不同于构造函数的是析构函数不能有任何参数,且一个类只允许有惟一的一个析构函数,也就是不能重载.

析构函数析构函数的格式:

~类名();

classPoint

{...

public:

Point(...);

//构造函数声明

~Point();

//析构函数声明

...

};析构函数析构函数在对象存在的函数体结束时或使用delete运算符释放new运算创建的对象时被自动调用与默认的构造函数一样,若在类的定义中没有显式地定义析构函数,则编译器自动地产生一个默认的析构函数,其格式为:

<类名>::~<类名>(){} Point::~Point(){}练习假定有类AB,有相应的构造函数的定义,能正确的执行“ABa(4),b(5),c[3],*p[2]={&a,&b};”,请问执行完此语句后共调用该类析构函数的次数为(

)A.14B.5C.3D.1注意事项1)先建后析构2)New:先分配内存,再初始化Delete:先析构,再释放内存this指针用类定义一个对象时,由系统自动建立指向该对象的指针称为this指针.this指针的默认定义格式:<类名>*constthis=&对象;5.this指针this指针的特性(1)this是每个成员函数的一个隐含参数,通过该参数,成员函数可以获知当前对象的地址,从而可以操纵对象所拥有的数据成员.(2)由于this指针是作为隐含参数传递给成员函数的,所以通常成员函数是以隐含方式使用该指针来访问本类的数据成员的.(3)this指针具有变量和常量的双重特征,当一个对象调用本类的成员函数时,this指针作为常量实参被传递,在函数体内固定指向该对象——常量特征;如果另一对象再调用成员函数时,该this指针必须重新定向——变量特征.(4)在某些场合需要显式地使用this指针来操作调用成员函数的对象this指针关于this指针this是成员函数中,指向调用该函数的对象自身(即成员函数所属的类对象的首地址)的隐含指针,形式如下:

classX{…… f(…)

}; Xa; a.f(…);此调用将被编译译转换成 X::f(&a,……);访问this指针

X::f(……) {

this->member }this指针的实现一个point类.classpoint{private: intx,y;public: point(inta,intb=10) {x=a;y=b; } intgetx() { returnx; } intgety() { returny; } voidmove(inta,intb) { x=a;y=b; }};Main(){pointp1,p2;p1.move(10,20}p2.move(3,4);}1、编译器改变类成员的定义,用额外的this指针重新定义每个类成员函数inlinepoint(point*this,inta,intb){}inlinegetx(point*this){returnthis->x;}inlinegety(point*this){returnthis->y;}inlinevoidmove(point*this,inta,intb){this->x=a;this->y=b;}inlinevoidmove(&p1,10,20)inlinevoidmove(&p2,3,4)2、编译器改变每个类成员函数的调用,加上一个额外的实参,即被调用对象的地址使用this指针区分二义性classX{ inti; f(inti) { this->i=i; }}使用this指针返回调用对象classX{ X&f(){……return*this;};X&g(){……return*this;};};……Xa;a.f().g();……this指针this指针的两种常见应用this指针关于this①尽管this是一个隐式指针,但在类的成员函数中可以显式地使用它.②在类X的非const成员函数里,this的类型就是X*.然而this并不是一个常规变量,不能给它赋值,但可以通过它修改数据成员的值.在类的const成员函数里,this被设置成constX*类型,不能通过它修改对象的数据成员值.③静态成员函数没有this指针,因此在静态成员函数中不能访问对象的非静态数据成员6.类和对象的性质类的性质

1.类本身的成员函数可以使用类的所有成员

2.只能通过类的对象访问公有成员函数,不能访问私有数据成员

3.类必须在其成员使用之前声明,可作为一个整体来使用

4.可以定义空类

5.声明类时使用花括号确定其作用域类和对象的性质对象的性质

1.同一类的对象之间可互相赋值

PointA,B(10,20); B=A; 2.可使用对象数组

PointA[5];类和对象的性质 3.对象可以用作函数参数

voidTest(Pointt){……} 4.可使用指向对象的指针,将对象的地址置于该指针中

Point*p=&A; p->Display(); 5.一个对象可用作另一个类的成员7.UML图形标识UML(UnifiedModelingLanguage统一建模语言)是一个复杂庞大的面向对象的系统建模语言.不是编程语言UML语言中用符号描述概念,概念间关系描述为连接符号的线.UML内容:各种类型的图形,分别描述软件模型的静态结构、动态行为、模块组织和管理如:

1)类:包括成员数据和成员函数(或方法)

2)对象:类的实例

3)类的继承或包含

4)类及对象之间的关系,相互作用与消息传递等UML图形标识类图:由类和与之相关的各种静态关系共同组成的图形对象图:一个包含了对象而没有包含类的类图.静态对象图:特定对象图的一个实例.UML图形标识类图使用上下分为三段的矩形表示,上部为类名,中部为数据成员(数据,UML中称属性),下部为该类的函数成员(行为,UML中称操作).Pointx:intY:int+Point(xx:int=0,yy:int=0)+Point(p:Point&)+GetX():int+GetY():int访问控制属性:+、-、#分别为公有、私有、保护UML的构成事物构造块事物构造块是对模型中最具有代表性的成分的抽象,表示系统中的元素结构事物:UML中的名词,它是模型的静态部分,描述概念或物理元素.行为事物:UML中的动词,它是模型中的动态部分,是一种跨越时间、空间的行为.分组事物:UML中的容器,用来组织模型,使模型更加的结构化.注释事务:UML中的解释部分,和代码中的注释语句一样,是用来描述模型的.结构事物类(class)和对象(object)接口(interface)构件(component)类和对象类是对一组具有相同属性、相同操作、相同关系和相同语义的对象的共同特征的抽象.UML中类是用一个矩形方框表示的,它包含三个区域,最上面是类名、中间是类的属性、最下面是类的方法对象则是类的一个实例对象名类名冒号图形位置颜色Draw()图形A:图形

接口——接口是描述某个类或构件的一个服务操作集.——接口描述了一个元素的外部可见行为.

UML符号接口构件构件也称组件,是指系统设计中的一个相对独立的软件部件.构件是系统设计的一个模块化部分,它把功能实现部分隐藏在内部,对外提供了一组外部接口.因此,两个具有相同接口的构件可以相互替换.

构件名称UML1.0习惯用法UML2.0习惯用法

构件名称行为事物交互(interaction): 是在特定语境中,共同完成某个任务的一组对象之间交换的信息集合.交互的表示法很简单,就是一条有向直线,

温馨提示

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

评论

0/150

提交评论