C++课件第6章:类与对象.pptx
- 文档编号:2676785
- 上传时间:2022-11-06
- 格式:PPTX
- 页数:105
- 大小:505.50KB
C++课件第6章:类与对象.pptx
《C++课件第6章:类与对象.pptx》由会员分享,可在线阅读,更多相关《C++课件第6章:类与对象.pptx(105页珍藏版)》请在冰豆网上搜索。
C+C+第6章类与对象C+内容提要类与对象的概念构造与析构函数复制构造函数成员对象运算符重载友元函数与友元类静态成员用const来保护类C+8.1类与对象传统的面向过程的程序设计是围绕功能进行的,用函数实现一个个功能。
面向过程编程的特点是数据和函数分开。
一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用。
程序=算法数据结构C+面向对象的编程面向对象程序设计是围绕类和对象进行的,用一个个类和对象去表现现实世界。
每一组数据都是有特定的用途的,是某种操作的对象。
也就是说,一组操作调用一组数据。
对象=算法数据结构程序=(对象+对象+对象+)+消息(方法)C+对象对象(object)是客观世界某一类事物的实例(instance),或者说,客观世界是由千万个对象组成的。
对象拥有自己的属性和行为,如电脑的各种硬件构成了电脑的静态特征,又称为属性(attribute)。
同时,电脑又可以有运行软件、编辑信息等操作,这些动态特征称为行为(behavior)。
与传统的结构体相比,对象的意义更深刻。
C+类在C+中对象的类型称为类(class)。
类代表了某一批对象的共性和特征。
类是对象的抽象,而对象是类的具体实例(instance)。
面向对象的程序设计具有以下三个特点:
u1.封装性(ecapsulation)u2.继承(iniheritance)与派生性(derivation)u3.多态性(polymorphism)C+从传统的结构体到类传统的结构体封装了数据成员,类当中则包括函数成员,与现实世界更吻合;传统的结构体成员数据读写无限制,类当中则提供了权限设置,保护了数据的安全性;传统的结构体无继承特性,类则可以通过派生和继承简化程序编写,并提供多态性。
C+类的定义classclassnameprivate:
/私有成员列表;public:
/公有成员列表;protected:
/保护成员列表;;/这里的分号不能缺少C+类中的权限设定符public(公共的)说明成员能从外部进行访问。
private(私有的)说明成员不能从外部进行访问。
每种说明符可在类体中使用多次。
访问限定符的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。
如果在类体起始点无访问说明符,系统默认定义为私有(private)。
C+类的封装与接口类把数据(事物的属性)和函数(事物的行为操作)封装为一个整体;通常数据成员被说明成私有的,函数成员被说明成公有的;从外部对数据成员进行操作,通常只能通过公有函数来完成,内部数据受到了良好的保护;成员函数可以直接使用类定义中的任一成员,可以处理数据成员,也可调用函数成员。
C+例:
圆类circle-1classcircleprivate:
doubler;public:
voidsetr(doubleR)r=R;C+例:
圆类circle-1doublegetr()returnr;voidprint()cout“圆的半径是:
rendl;C+例:
圆类circle的使用intmain()circlec;/c是circle的对象c.setr(5);/c.r=5无法运行c.print();coutc.getr();/这里输出5cout0)r=R;C+类外函数定义通常在类定义中,成员函数仅作声明。
函数定义通常在类的说明之后进行,格式如下:
返回值类型类名:
函数名(参数表)/函数体其中运算符“:
”称为作用域解析运算符(scoperesolutionoperator),它指出该函数是属于哪一个类的成员函数。
C+例:
圆类circle-2classcircleprivate:
doubler;public:
voidsetr(doubleR);doublegetr();voidprint();C+例:
圆类circle-2voidcircle:
setr(doubleR)r=R;doublecircle:
getr()returnr;voidcircle:
print()cout圆的半径是:
r,再加成员数据或成员函数名就可以了。
通过成员运算符直接使用的成员必须是公有的成员,只有公有成员才能在对象的外面对它进行访问。
什么意思?
对比:
传统C语言中结构体无权限限制,C+中结构体内成员数据默认是public的。
C+6.2构造函数与析构函数普通变量通过赋值运算符=进行初始化:
例:
inta=5;charc=x;数组和结构体变量通过初始化列表进行初始化:
例:
inta3=1,2,3;对象因为封装性的问题,必须通过构造函数进行初始化。
C+构造函数的特点1.函数名与类名相同。
2.构造函数无函数返回类型说明。
注意是什么也不写,也不可写void!
3.新的对象被建立,构造函数自动被调用,且只调用一次。
4.构造函数可以重载,根据参数的不同选择执行不同的构造函数。
C+构造函数的特点5.构造函数可以在类中定义,也可在类外定义。
6.如果类说明中没有给出构造函数,则C+编译器自动给出一个默认的构造函数:
类名()7.只要定义了一个构造函数,系统就不会自动生成默认的构造函数。
8.只要构造函数是无参的或各参数均有默认值的,C+编译器都认为是默认的构造函数,但默认的构造函数只能有一个。
C+例:
圆类circle的构造函数类中声明:
circle(doubleR=0);类外定义:
circle:
circle(doubleR)r=R;C+例:
圆类circle的构造函数main当中定义对象circlec1;/调用默认构造函数,r=0circlec2();/默认构造函数的错误用法,会误认为是函数c2的声明circlec3(3);/调用构造函数,参数跟在对象后面,r=3C+默认构造函数默认构造函数虽然不是必须,但建议显式定义,同时建议使用全部默认参数而不是无参数的方式。
定义对象数组的时候,无法使用构造函数列表的方式,只能对数组中的每个对象使用默认构造函数来进行构造。
例:
circlec5;/调用5次默认构造函数定义对象指针的时候,并不调用构造函数。
例:
circle*pc;/并不调用构造函数C+析构函数当一个对象的生命周期结束时,C+会自动调用析构函数(destructor)对该对象并进行善后工作,1.构函数名与类名相同,但在前面加上字符,如CGoods()。
2.析构函数无函数返回类型,与构造函数在这方面是一样的。
但析构函数不带任何参数。
3.一个类有一个也只有一个析构函数,这与构造函数不同。
析构函数可以默认。
4.对象注销时,系统自动调用析构函数。
C+例:
矩形类Rectangle数据成员:
左上点的坐标top和left,右下点的坐标down和right(还可考虑矩形的面积area和周长length等)。
函数成员:
四参数默认构造函数,多个置数函数,输出函数等。
C+例:
矩形类RectangleclassRectangleintleft,top,right,bottom;public:
Rectangle(int=0,int=0,int=0,int=0);/默认构造函数必须在此指定默认实参Rectangle()/析构函数,在此函数体为空voidAssign(int,int,int,int);voidSetLeft(intt)left=t;voidSetRight(intt)right=t;voidSetTop(intt)top=t;voidSetBottom(intt)bottom=t;voidShow();C+例:
矩形类RectangleRectangle:
Rectangle(intl,intt,intr,intb)left=l;top=t;right=r;bottom=b;voidRectangle:
Assign(intl,intt,intr,intb)left=l;top=t;right=r;bottom=b;voidRectangle:
Show()cout”left-toppointis(”left”,”top”)”n;cout”right-bottompointis(”right”,”bottom”)”n;C+例:
矩形类Rectangleintmain()Rectanglerect;rect.Show();rect.Assign(100,200,300,400);rect.Show();Rectanglerect1(0,0,200,200);rect1.Show();return0;C+6.3复制构造函数同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制是完全可行的。
这个复制过程只需要复制数据成员,而函数成员是共用的(只有一份代码)。
在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为复制构造函数(CopyConstructor)。
C+默认的复制构造函数系统会自动提供称为默认的按成员语义支持的复制构造函数,亦称为默认的按成员初始化。
按成员作复制是通过依次复制每个数据成员实现的。
赋值运算符“=”称默认的按成员复制赋值操作符(CopyAssignmentOperator),同类对象之间可以用“=”直接复制。
通常情况下默认支持已经足够。
但在某些情况下,它对类与对象的安全性和处理的正确性还不够,这时就要求提供特殊的复制构造函数和复制赋值操作符的定义。
C+复制构造函数和赋值的区别当对象还没建立的时候,就算使用赋值运算符,也是调用的复制构造函数。
circlec1,c4;circlec2(c1);/显式调用复制构造函数;circlec3=c1;/也是调用复制构造函数;c4=c2;/调用的赋值运算符C+复制构造函数的三个用途定义新对象时显式调用复制构造函数;当函数的参数是类的时候,会隐含调用复制构造函数,用实参作为参数来复制构造形参;当函数的返回类型是类的时候,也会隐含调用复制构造函数,用return表达式的值来复制构造一个临时对象。
C+复制构造函数的特点-1复制构造函数的参数必须采用引用。
如果其参数是真实的对象而不是引用,则又会引入新的一轮调用复制构造函数的过程,出现了无穷递归。
C+复制构造函数的特点-2当函数的返回值是类对象,编译系统会在调用函数的表达式中创建一个临时对象,该临时对象的生存周期只在函数调用处的表达式中。
所谓return对象,实际上是调用复制构造函数把该对象的值拷入临时对象。
如果返回的是变量,处理过程类似,只是不调用构造函数。
C+例:
返回对象的函数circle:
circle(circle&c)r=c.r;cout“复制构造函数n“;circlef(intx)circlec(x);returnc;intmain()f
(2).print();C+附:
临时对象与无名对象临时对象:
当函数的返回类型是类的时候,将return表达式中的值作为实参,复制构造临时对象并传递给主调函数。
当函数调用的语句结束之后,临时对象被析构。
无名对象:
以直接调用构造函数的形式出现,可参与赋值、初始化、传参和作为返回值。
需要注意的是:
无名对象在初始化、传参和作为返回值的时候,不调用复制构造函数。
C+无名对象参与初始化例:
circlec=circle
(2);原意:
circle
(2)的原意是以2为实参创建无名对象,并用该无名对象来复制构造c。
实际:
为了提高编译器效率,省略了无名对象的构造过程,直接用其实参2来构造了c。
等价于:
circlec
(2);C+无名对象作为函数参数例:
voidf(circlec)coutfuncendl;intmain()f(circle
(2);return0;C+无名对象作为返回值例:
circlef()returncircle
(1);intmain()f().print();return0;C+无名对象的总结形式以构造函数的显式调用出现在需要调用复制构造函数的场合下,无名对象并不产生,而直接用其参数来构造相应的对象(如形参、临时对象等)在其它场合下,无名对象会在完成运算后直接析构。
例:
circlea;a=circle
(2);/这里真正产生了无名对象,运算之后立刻析构。
C+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课件 对象