欢迎来到天天文库
浏览记录
ID:51777225
大小:648.81 KB
页数:71页
时间:2020-03-07
《C++程序设计与实践 教学课件 作者 白忠建chapter06 深入类和对象.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++程序设计与实践第六章深入类和对象电子科技大学信息与软件工程学院白忠建第六章深入类和对象本章要点构造函数。构造函数用于自动地初始化类对象的状态和申请资源。构造函数可以重载,以适应不同的初始化要求。析构函数。在对象销毁是自动调用,释放对象占据的资源。一个类只能拥有一个析构函数。复制构造函数。复制构造函数是一个带有自己类型(常量)引用的构造函数。用于从已存在对象中依据规则复制数据。this指针。每个对象都拥有一个指向自己的指针,它用关键字this表示。不过,类的静态成员函数没有this指针。友元。一个类
2、的友元可以访问该类的所有成员。但这只是基于效率的考虑。应该慎用友元6.1问题引入首先再次来探讨一下对象的初始化问题。请看如下代码(ex6-1.cpp):inth(){Rectangler;Listlist;list.push_back(reinterpret_cast(&r));return0;}6.1问题引入那么问题出在哪里呢?Listlist;list.push_back(reinterpret_cast(&r));因此,在创建对象后立即调用其初始化函数init(
3、)是必须的。如果这项工作能够自动进行将是非常有吸引力的方案。C++提供这样的机制吗?List对象在创建后处于未知状态。具体一点,就是其内部的head和tail指针都没有指向特定单元。6.1问题引入第二需要考虑的问题是,如果对象在运行时申请了系统资源,而这种资源又是有限的,那么如何在对象失效时释放呢?classFoo{private:char*memblock;public:voidAlloc(size_tsize){memblock=newchar[size];}};voidf(){Foofoo;foo
4、.Alloc(1024);}当f()结束后,foo对象自动失效,但此时它在活跃是申请的内存没有被显式释放,并且这段内存被系统标记为占据,但又却永远无法被访问到了。那么C++有没有一种自动机制来完成这项工作呢?6.1问题引入第三个问题是,类的每一个对象都共享成员函数的代码。设有如下定义:Rectangler1,r2;r1.create();r2.create();那么成员函数create()是如何知道自己工作在哪个对象上呢?6.1问题引入第四个问题。类的保护机制在有些追求效率的场合显得过于死板。例如,Re
5、ctangle类的width属性是一个私有成员,当它要被访问的时候,由于保护机制的作用,只能采用如下的方式来进行访问:int&Rectangle::Width(){returnwidth;}而这样做对于频繁的访问将会带来(仅仅是)效率上的问题。能否有一种机制突破这个限制呢?6.2构造函数和析构函数6.2.1构造函数的定义类的构造函数(constructor)是类中的一个非常特殊的成员,它甚至没有名字。它之所以看起像是一个函数,是因为C++用了函数修饰符(functionspecifier)来说明构造函数
6、的存在。构造函数不仅在声明形式上非常特别,它的“返回值”也很特殊:在声明或定义构造函数时不能为其指定返回类型,甚至void也不行。函数修饰符的语法为:函数名(参数列表);6.2构造函数和析构函数构造函数的调用是自动进行的。这甚至不是一种程序员的可选项,而是编译器实施的一种强制性机制。每当创建类的一个新对象时,编译器将在创建的地方自动生成调用构造函数的代码,用以完成对象的初始化工作。在必要的时候,需要给出构造函数的参数。类的构造函数的作用是:(1)分配一个对象的数据成员的存储空间;(该功能由系统自动完成。
7、)(2)执行构造函数(体),一般是初始化一个对象的部分或全体数据成员。6.2构造函数和析构函数1.构造函数的定义构造函数定义的语法如下:class类名{public:类名(参数列表);//构造函数声明};6.2构造函数和析构函数类的构造函数有如下特征:构造函数不能是虚函数;构造函数不能是静态的;不能获取构造函数的地址;构造函数因其没有函数名而不能被显式调用。但在显式类型转换时,可以使用函数标记法(functionalnotation)来引起构造函数的调用。函数标记法的语法为:类名(参数列表);6.2构造
8、函数和析构函数classRectangle//简化版{public:stringname;Rectangle(){name="Rectangle";height=rand()%10+5;width=rand()%15+5;++Quadrangle::counter;}//othermembersprivate:intwidth,height;//高和宽};一旦为类显式定义了一个构造函数,那么每当在程序中用如下方式定义对象时,例如:Recta
此文档下载收益归作者所有