教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

chapter06 深入类和对象

来源:网络收集 时间:2025-09-12
导读: C++程序设计与实践第六章 深入类和对象电子科技大学信息与软件工程学院 白忠建 第六章 深入类和对象本章要点 构造函数。构造函数用于自动地初始化类对象的状态和 申请资源。构造函数可以重载,以适应不同的初始化要 求。 析构函数。在对象销毁是自动调用,释

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字,全部文档内容请下载后查看。喜欢就下载吧 ……
chapter06 深入类和对象.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1813739.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)