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

server/2024/10/9 5:24:03/

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/server/129114.html

相关文章

C. Bitwise Balancing

原题 C. Bitwise Balancing 解析 题意如图 我们要求 a , 其实 a 只要满足条件即可, 我们可以发现每一位都不会影响到其它位, 因此对每一位检查, 发现对b c a, d 有固定结果 b c a d 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 bcd 无法为 011 和 1…

Java 表单提交:如何像 PHP 和 Python 一样简单?

在 Java 中,处理表单提交通常与 PHP 或 Python 中类似,但由于 Java 是一种强类型语言,处理表单提交涉及更多配置和设置。然而我将通过一些现代框架(如 Spring Boot),Java 可以实现和 PHP、Python 一样简便的…

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要:随着大数据时代的到来,数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构,分析它们在数据处理、性能、可扩展性等方面的差异,为企业数据集成提供技术指导。 一、引言 在大数据时代,企业需要…

云原生(四十五) | ECS服务器项目部署实战

文章目录 ECS服务器项目部署实战 一、ECS服务器项目部署说明 二、下载WordPress 三、部署WordPress需要哪些应用 ECS服务器项目部署实战 一、ECS服务器项目部署说明 案例:为了让大家更好的理解ECS服务器的使用场景,我们通过一个比较经典的WordPres…

构建electron项目

1. 使用electron-vite构建工具 官网链接 安装构建工具 pnpm i electron-vite -g创建electron-vite项目 pnpm create quick-start/electron安装所有依赖 pnpm i其他 pnpm -D add sass scss1. 启动项目 2. 配置 package.json "dev": "electron-vite dev --…

【Java】—— 数据结构与集合源码:数据结构概述与线性表、二叉树

1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软件、硬件环境 敌人:项目或模块的功能需求 指挥官:编写程序的程序员 士兵和装备:一行一行的代码 战术和策略:数据结构 上…

开发环境搭建之VScode的安装及使用

VScode的下载及安装 Visual Stuio Code(以下简称VSCode)是微软出的一款免费开源的轻量级编辑器。VSCode支持多平台,有 Windows、Linux和macOS 三个版本,是一个跨平台的编辑器。可通过以下载链接获取:https://code.visu…

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式,很好用,也是OBS的默认推荐录制格式,因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑,最直接的方法是将MKV转换为MP4格式,最方便且安全无损的转换方法便是用FFmp…