chapter06 深入类和对象
C++程序设计与实践第六章 深入类和对象电子科技大学信息与软件工程学院 白忠建
第六章 深入类和对象本章要点 构造函数。构造函数用于自动地初始化类对象的状态和 申请资源。构造函数可以重载,以适应不同的初始化要 求。 析构函数。在对象销毁是自动调用,释放对象占据的资 源。一个类只能拥有一个析构函数。 复制构造函数。复制构造函数是一个带有自己类型(常 量)引用的构造函数。用于从已存在对象中依据规则复 制数据。 this指针。每个对象都拥有一个指向自己的指针,它用关 键字this表示。不过,类的静态成员函数没有this指针。 友元。一个类的友元可以访问该类的所有成员。但这只 是基于效率的考虑。应该慎用友元
程 序 设 计 与 实 践
C++
6.1 问题引入首先再次来探讨一下对象的初始化问题。请 看如下代码(ex6-1.cpp):int h() { Rectangle r; List list; list.push_back(reinterpret_cast<QUADPT R>(&r));return 0;
}
程 序 设 计 与 实 践
C++
6.1 问题引入那么问题出在哪里呢? List list; List 对 象 在 创 建 后 处 于 未 知状态。具体一点,就是 list.push_back(reinterpret_cast<QU 其内部的 head 和 tail 指针 ADPTR>(&r)); 都没有指向特定单元。 因此,在创建对象后立即调用其初始化函数 init()是必须的。如果这项工作能够自动进行 将是非常有吸引力的方案。C++提供这样的 机制吗?
程 序 设 计 与 实 践
C++
6.1 问题引入第二需要考虑的问题是,如果对象在运行时 申请了系统资源,而这种资源又是有限的, 那么如何在对象失效时释放呢?class Foo { private: char *memblock; public:
void f() { }
Foo foo; foo.Alloc(1024);C++
void Alloc(size_t size) { memblock = new char[size]; } 当 f() 结束后, foo 对象自动失效,但此时 }; 它在活跃是申请的内存没有被显式释放, 并且这段内存被系统标记为占据,但又却 永远无法被访问到了。那么C++有没有一 种自动机制来完成这项工作呢?
程 序 设 计 与 实 践
6.1 问题引入第三个问题是,类的每一个对象都共享成员 函数的代码。设有如下定义: Rectangle r1, r2; r1.create(); r2.create(); 那么成员函数 create() 是如何知道自己工作 在哪个对象上呢?
程 序 设 计 与 实 践
C++
6.1 问题引入第四个问题。类的保护机制在有些追求效率 的场合显得过于死板。例如, Rectangle 类 的 width 属性是一个私有成员,当它要被访 问的时候,由于保护机制的作用,只能采用 如下的方式来进行访问: int& Rectangle::Width() { return width; } 而这样做对于频繁的访问将会带来(仅仅是) 效率上的问题。能否有一种机制突破这个限 程 序 设 计 制呢? 与实 践
C++
6.2 构
造函数和析构函数6.2.1 构造函数的定义 类的构造函数(constructor) 是类中的一个非 常特殊的成员,它甚至没有名字。它之所以 看起像是一个函数,是因为 C++用了函数修 函数修饰符的语法为: 函数名(参数列表); 饰符(function specifier)来说明构造函数的 存在。 构造函数不仅在声明形式上非常特别,它的 “返回值”也很特殊:在声明或定义构造函 数时不能为其指定返回类型,甚至void也不 行。
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数 构造函数的调用是自动进行的。这甚至不是一种 程序员的可选项,而是编译器实施的一种强制性 机制。每当创建类的一个新对象时,编译器将在 创建的地方自动生成调用构造函数的代码,用以 完成对象的初始化工作。在必要的时候,需要给 出构造函数的参数。 类的构造函数的作用是:– (1) 分配一个对象的数据成员的存储空间;(该功能由 系统自动完成。) – (2) 执行构造函数(体),一般是初始化一个对象的部 分或全体数据成员。程 序 设 计 与 实 践 C++
6.2 构造函数和析构函数1. 构造函数的定义 构造函数定义的语法如下: class 类名 { public: 类名(参数列表); //构造函数声明 };
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数类的构造函数有如下特征: 构造函数不能是虚函数; 构造函数不能是静态的; 不能获取构造函数的地址; 构造函数因其没有函数名而不能被显式调 用。 但在显式类型转换时,可以使用 函数标记法(functional notation)来 引起构造函数的调用。函数标记法 的语法为: 类名(参数列表);
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数class Rectangle //简化版 { public: string name;
一旦为类显式定义了一个构造函数,那 Rectangle() 么每当在程序中用如下方式定义对象时, { 例如: name = "Rectangle"; Rectangle rect; height = rand() % 10 + 5; rect 对象的构造函数在该对象定义的同 width = rand() % 15 + 5; 时会被 自动调用,从而构造出一个具有 ++Quadrangle::counter; 初始状态的对象。 }//other members private: int width, height; //高和宽 };
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数在绝大多数情况下,类的构造函数应该具有 public访问属性。非常难以想象具有private 属性的构造函数会用在什么地方。不过,特 例总是会存在的。在需要禁止复制的情况下, 类的(某种)构造函数就应该是私有的。C++ 程 序 设 计 与 实 践
6.2 构造函数和析构函数2. 构造函数的参数Rectangle::Rectangle(int w, int h) { name = "Rectangle"; height = h; width = w; ++Quadrangle::counter; } Rectangle rect(10, 20); //ok Rectangle rect2; //error!
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数3. 构造函数的参数是可以缺省的 构造函数参数可以是缺省的,例如: Rectangle::Rectangle(int w = 5, int h = 5); 在定义对象时,就可以不必指定参数。例如: Rectangle rect; //OK,w和h都取缺省值5 Rectangle rect2(10, 20); //OK,用指定参数而非 缺省参数初始化对象 Rectangle rect3(10); //OK , w=10 ,而 h 取缺省 值,即5。
程 序 设 计 与 实 践
C++
6.2 构造函数和析构函数4. 初始化列表 构造函数的初始化列表是一种特殊的初始化 机制,它的语法如下: 构造函数名(参数列表) [: 成员名(表达式) [, 成员名(表达式)…]]Rectangle(int w = 5, int h = 5) : name("Rectangle"), width(w), height(h) { ++Quadrangle::counter; //标识、高和宽 已经被初始化 }C++ 程 序 设 计 与 实 践
…… 此处隐藏:1762字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)