当前位置: 首页 > article >正文

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

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.kler.cn/news/339272.html

相关文章:

  • Sym-NCO:利用对称性进行神经组合优化
  • 餐饮生存战:平价消费时代,别盲目卷低价
  • 2.4Mybatis——缓存机制
  • 算法:前缀和算法模版
  • [笔记] 仿射变换性质的代数证明
  • PyQt入门指南一 框架介绍
  • 一分钟掌握 Java22 新特性
  • STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8
  • 数据结构——排序(插入排序)
  • VAD 论文学习
  • 每日OJ题_牛客_分组_枚举+二分_C++_Java
  • OpenFeign 工作原理源码记录
  • OpenFegin
  • 【多重循环在Java中的应用】
  • 【如何学习计组】——基本概念与原理
  • 大数据新视界 --大数据大厂之数据血缘追踪与治理:确保数据可追溯性
  • windows配置java环境变量
  • 基于java+springboot的宠物商店、宠物管理系统
  • 大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询
  • LeetCode:134. 加油站(Java 贪心)