C++学习笔记----8、掌握类与对象(四)---- 不同类型的数据成员(2)

ops/2024/12/22 16:02:34/

3、引用数据成员

        Spreadsheet与SpreadsheetCell是伟大的,但是不是它们自己就能成为有用的应用程序。需要代码去控制整个spreadsheet程序,可以将其打包成一个SpreadsheetApplication类。假定接下来我们要让每个Spreadsheet来保存一个应用程序对象的引用。这时候SpreadsheetApplication类的确切定义还不太重要,所以下面的代码只是简单地定义了一个空类。Spreadsheet类修改以包含一个新的叫做m_theApp数据成员的引用:

export class SpreadsheetApplication { };export class Spreadsheet
{
public:Spreadsheet(std::size_t width, std::size_t height,SpreadsheetApplication& theApp);// Code omitted for brevity.
private:// Code omitted for brevity.SpreadsheetApplication& m_theApp;
};

        该定义添加了一个数据成员SpreadsheetApplication的引用。推荐在这种情况下使用引用而不是指针,因为Spreadsheet应该总是指向SpreadsheetApplication。指针无法保证这一点。

        注意对于应用程序的引用的保存只是为了演示引用作为数据成员的使用。不推荐用这种方式将Spreadsheet与SpreadsheetApplication类耦合在一起,应该使用例如MVC的模式。

        在构造函数中应用程序的引用给到了每个Spreadsheet。如果不指向任何东西的话引用是无法生存的,所以m_theApp必须在构造函数初始化器中给一个值。

Spreadsheet::Spreadsheet(size_t width, size_t height,const SpreadsheetApplication& theApp): m_id{ ms_counter++ }, m_width{ min(width, MaxWidth) }, m_height{ min(height, MaxHeight) }, m_theApp{ theApp }
{// Code omitted for brevity.
}

        在拷贝构造函数中也必须初始化引用成员。这个会自动处理因为Spreadsheet拷贝代理给到了non-copy构造函数,它初始化引用数据成员。

        记住在初始化引用之后,就不可以改变它指向的对象了。不能在赋值操作符中赋值给引用。依据你的使用情况,这可能意味着不能为你的带有数据成员的类提供赋值操作符。如果是这样的话,赋值操作符会被标记为删除。

        最后,引用数据成员可以被标记为const。例如,你可能会决定 让Spreadsheet卡哇伊有一个对应用程序对象的reference-to-const。可以简单地修改类定义以便将m_theApp声明为reference-to-const:

export class Spreadsheet
{
public:Spreadsheet(std::size_t width, std::size_t height,const SpreadsheetApplication& theApp);// Code omitted for brevity.
private:// Code omitted for brevity.const SpreadsheetApplication& m_theApp;
};

http://www.ppmy.cn/ops/123067.html

相关文章

HUAWEI_HCIA_实验指南_Lib1.4_配置通过Telnet登录系统

一、原理概述 Telnet(Telecommunication Network Protocol)起源于ARPANET,是最早的Internet应用之一。 Telnet 通常用在远程登录应用中,以便对本地或远端运行的网络设备进行配置、监控和维护。如网络中有多台设备需要配置和管理,用户无需为每一台设备…

DES数据加密标准

目录 一、算法原理每一轮的加密过程1. 初始分组2. 16轮迭代加密3. F函数(核心加密步骤)4. 16轮加密结束 密钥生成过程 二、代码实例 一、算法原理 DES(数据加密标准)算法对明文数据进行16轮的替换和置换操作,每一轮都…

Python字符串基本操作

目录 一、字符串的创建 1.1 转义字符 1.2 原始字符串 二、字符串的访问与切片 2.1 字符访问 2.2 切片(Slicing) 三、字符串的连接与重复 四、字符串的格式化 4.1 百分号格式化 4.2 str.format() 方法 4.3 f-字符串(Python 3.6及以上) 五、字符串的方法 5.1 大…

docker compose入门6—如何挂载卷

在 Docker Compose 中,可以通过 volumes 字段将宿主机的文件或目录挂载到容器中。这样可以实现数据持久化、共享数据或配置等。以下是一些常见的挂载方式和示例。 1. 挂载单个文件 如果你想将宿主机上的一个特定文件挂载到容器中,可以使用以下格式&…

QD1-P2 HBuilderX编辑器

本节学习: HTML课程内容介绍HBuilderX编辑器的使用 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p2 HTML 内容 基础语法 标签整体架构DOCTYPE 常用标签 标题和水平线段落和换行列表div 和 span格式化标签图片超链接标签表格表单字符实体 编辑器 HBuilder…

FireRedTTS - 小红书最新开源AI语音克隆合成系统 免训练一键音频克隆 本地一键整合包下载

小红书技术团队FireRed最近推出了一款名为FireRedTTS的先进语音合成系统,该系统能够基于少量参考音频快速模仿任意音色和说话风格,实现独特的音频内容创造。 FireRedTTS 只需要给定文本和几秒钟参考音频,无需训练,就可模仿任意音色…

chatGPT对我学术写作的三种帮助

chatGPT对我学术写作的三种帮助 概述提高学术写作水平大模型选择概述上下文以提供精确的指令 提升同行评审优化编辑反馈 概述 从生成式人工智能中获得的价值并非来自于技术本身盲目地输出文本,而是来自于与工具的互动,并利用自身的专业知识来完善它所生…

猴子吃桃-C语言

1.问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个…