C++ 聚合类(Aggregate Class)

2023-11-01

C++ 聚合类(Aggregate Class)

概述

该篇文章是用于梳理在学习聚合类的相关文章过程中总结归纳的相关知识点。用于后续深入理解和使用聚合类进行准备。

聚合类定义

首先看一下C++标准中的定义:

An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), 
no private or protected non-static data members (clause 11), 
no base classes (clause 10), and no virtual functions (10.3).

由以上定义看出满足以下条件的类才可以称之为聚合类

  1. 无自定义构造函数;
  2. 非静态数据成员没有大括号或等号初始化器,即类内没有初始值;
  3. 无私有或保护的非静态成员;
  4. 无基类和虚函数。

下面我们举一个简单的例子进行说明:
我们可以提供一个花括号扩起来的成员初始值列表,并用它初始化聚合类的数据成员,初始值的顺序必须与声明的顺序一致,初始值列表的元素个数少于类的成员数量,则靠后的成员被值初始化。

struct Person
{
	std::string name;
	int height;
};

int main()
{
	Person person = {"xiaohong",10};
	std::cout << person.name<<" "<<person.height << std::endl;
	system("pause");
	return 0;
}

以下我们在例举一些典型的非聚合类和聚合类:

// 非聚合类
class NotAggregate1
{
  virtual void f() {} //定义了虚函数
};

class NotAggregate2
{
  int x; //定义了非静态的私有属性
};

class NotAggregate3
{
public:
  NotAggregate3(int) {} 自定义了构造函数
};

// 聚合类
class Aggregate1
{
public:
  NotAggregate1 member1;   //公共成员
  Aggregate1& operator=(Aggregate1 const & rhs) {/* */} //重载赋值运算符
private:
  void f() {} // 私有函数
};

聚合类的特性

聚合类的的主要特性是可以使用**{}**符号像数组一样进行初始化。
先从数据的初始化进行说明,数组初始化的形式如下:
Type array_name[n] = {a1, a2, …, am};

if (m == n)
	array_name的第i个元素由ai进行初始化
else if (m < n)
	前m个元素由1~m个a进行初始化,m-n个元素由'value-initialized'实现初始化
else if (m > n)
	编译器报错
else (类似数组定义形式: int a[] = {1, 2, 3};)
	数组的长度m = = n

value-initialized

下面解释一下什么是值初始化:
当一个标量类型(bool、int、char、double、pointers 等)的对象被值初始化时,这意味着它被初始化为 0 表示该类型(false 表示 bool,0.0 表示 double 等)。当具有用户声明的默认构造函数的类类型对象进行值初始化时,调用其默认构造函数。这个定义不精确,有点不正确,但它应该给你基本的概念。不能对引用进行值初始化。 例如,如果类没有合适的默认构造函数,则非聚合类的值初始化可能会失败。
下面例举一些典型例子,用于说明数组初始化:

class A
{
public:
  A(int) {} //无默认构造函数
};
class B
{
public:
  B() {} //默认构造函数
};
int main()
{
  A a1[3] = {A(2), A(1), A(14)}; //正常 n == m
  A a2[3] = {A(2)}; //错误 类A没有默认构造函数. 无法对a2[1]和a2[2]进行值初始化
  B b1[3] = {B()}; //正常 b1[1]和b1[2]可以通过默认构造函数进行值初始化
  int Array1[1000] = {0}; //所有元素初始化为0;
  int Array2[1000] = {1}; //第一个元素初始化为1,其它全部为0;
  bool Array3[1000] = {}; //所有的值被初始化为false
  int Array4[1000]; //没有初始化,数组元素都是不确定的值;
  int array[2] = {1, 2, 3, 4}; //错误, 初始化值个数大于数组长度
}

聚合类的初始化方法

现在让我们看看如何用大括号初始化聚合类。几乎和数组的值初始化相同的方式。我们将按照在类定义中出现的顺序初始化非静态数据成员(根据定义,它们都是公共的)。如果初始化器比成员少,则其余的都是值初始化的。如果初始值设定项少于成员数,则其余的都是值初始化的。如果无法对未显式初始化的成员之一进行值初始化(如数据类型不匹配),则会出现编译时错误。如果初始值设定项过多,我们也会收到编译时错误。
如下面代码中所示:

struct X
{
  int i1;
  int i2;
};
struct Y
{
  char c;
  X x;
  int i[2];
  float f; 
protected:
  static double d;
private:
  void g(){}      
}; 

Y y = {'a', {10, 20}, {20, 30}};

在上面的例子中y.c用’a’初始化,y.x.i1用10,y.x.i2用20,y.i[0]用20,y.i[1]用30和y.f是值初始化的,即用0.0初始化。 受保护的静态成员 d 根本没有初始化,因为它是静态的。

union(聚合)

聚合联合的不同之处在于,可以只用大括号初始化它们的第一个成员。如果在 C++ 方面足够先进,甚至可以考虑使用联合(它们的使用可能非常危险,必须仔细考虑。

总结

现在我们知道了聚合的特别之处,让我们尝试了解对类的限制; 也就是说,他们为什么在那里。 我们应该明白,带大括号的成员初始化意味着该类只不过是其成员的总和。如果存在用户定义的构造函数,则意味着用户需要做一些额外的工作来初始化成员,因此大括号初始化将是不正确的。如果存在虚函数,则意味着该类的对象(在大多数实现中)具有指向该类的所谓 vtable 的指针,该指针是在构造函数中设置的,因此大括号初始化是不够的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 聚合类(Aggregate Class) 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 极限的运算法则

    极限的运算法则 两个无穷小的和也是无穷小 定理 有限个无穷小的和也是无穷小 无穷多个无穷小的和是1 定理 有界函数与无穷小的乘机也是无穷小 推论 常数与无穷小的乘积也是无穷小 推论 有限个无穷小的乘积也是无穷小 无限多个无穷小的乘积不一定是
  • 解决eclipse突然打不开了的问题

    网上搜了有大概六种 我又get一个解决方案 找到属于自己的方案才是关键 解决方式 7种 1 通过在命令行中输入 where java 找到除jdk目录下的所有java相关程序 直接删掉 一般会在C WINDOWS system32下 2 内
  • SQL刷题:SQL必知必会

    MySQL函数参考教程 1 多字段排序用逗号隔开 对多个字段排序的时候 同样满足默认ASC select cust id order num from Orders order by cust id order date desc sele
  • PicGo使用阿里云OSS配置图床

    PicGo使用阿里云OSS配置图床 前言 安装 PicGo PicGo molunerfinn com 以上是PIcGo的配置阿里云OSS需要的值 1 阿里云创建用户 登录阿里云 鼠标移到头像位置则可看到 点击访问控制 创建新用户 开启op
  • 摩拜单车红包骑行引发的潮汐问题思考

    前言 摩拜刚刚推行红包骑行的时候写的 最近比较忙一直忘记了 今天有时间发出来 言语不当之处 还望见谅 希望各位发表意见 谢谢 PS 摩拜单车相关人员已经看过 表示还可以 谢谢 2017 年 共享单车有很多 最先进入人们眼帘的应该是那一个类似
  • Part 5:Pandas 数据统计函数【汇总类统计、唯一去重和按值计数、相关系数和协方差】

    Pandas 数据统计函数 1 汇总类统计 2 唯一去重和按值计数 3 相关系数和协方差 import pandas as pd 1 预备步骤 对数据进行读取和预处理 将温度都改为Int类型 fpath datas beijing tian
  • jquery正则表达式写法

    const FloatRegex 0 9a zA Z 1 if FloatRegex test value this message error 只能输入数字 字母 下划线 小圆点 return
  • 计算机基础知识总结

    文章目录 1 Linux常用基本命令 文件管理 用户管理 进程管理 软件仓库搭建 远程登陆服务器 文件传输 定时任务 延迟任务 2 C 基础知识 面向对象的四大特征 C 和C语言有什么不同 new delete 和 malloc free
  • 【翻译】API版本管理:它是什么,为什么这么难?

    如果你想在API技术专家之间展开一场辩论 只要让他们分享他们对 API版本 的看法 可以肯定的是 你会在短时间内发现一些强烈的感受 术语 API版本 已经成为 改变API 的同义词 这是理清支持已发布的API持续变化而又不给API消费者带来
  • java中方法名,对象名,变量名,标识符,关键字的规则

    java中方法名 对象名 变量名 标识符 关键字的规则 总绪 方法名 对象名 变量名 标识符 关键字 总绪 所有命名规则必须遵循以下规则 1 名称只能由字母 数字 下划线 符号组成 2 不能以数字开头 3 名称不能使用JAVA中的关键字 4
  • 机试之前最后的知识点总结。

    题目描述 C 头文件大全 解题思路一 include
  • 敏捷Agile: Epic vs UserStory vs Task

    Epic Story Task Epic Epic是User Story逻辑上的集合 一个Epic可以被break down成多个小的User Story 一个Epic可能需要多个Sprint才能完成 User Story vs Task
  • TensorFlow各版本下载地址

    TensorFlow各版本自主下载地址 cpu版本 pip install 链接 https pypi python org pypi tensorflow 2 0 0 下载地址链接 https pypi org project tenso
  • MATLAB实现基本的PSO粒子群算法优化目标函数(求函数最小值的解),写成函数的形式,并举例演示如何使用

    粒子群优化算法 Particle Swarm Optimization 是一种进化计算机技术 evolutionary computation 源于对鸟类捕食行为的研究 是一种基于迭代的优化工具 事实上 像PSO这种同属于元启发式优化算法有
  • java中静态代码块详解

    今天在项目中看到这行代码 静态代码块 很久没用静态代码块了 今天来复习一下 依旧按照为什么 是什么 怎么用 的思想 去学习 为什么 先说说代码中为什么要使用这种写法吧 还记得静态代码块的特点吗 随着类的加载而执行 而且只执行一次 对 没错
  • 求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。...

    近日 项目中有一个耗时较长的Job存在CPU占用过高的问题 经排查发现 主要时间消耗在往MyBatis中批量插入数据 mapper configuration是用foreach循环做的 差不多是这样 由于项目保密 以下代码均为自己手写的de
  • Windows获取CPU、内存和磁盘使用率脚本

    获取CPU使用率脚本 vbs 另存为cpu vbs On Error Resume Next Set objProc GetObject winmgmts root cimv2 win32 processor cpu0 Wscript Ec
  • C语言:输出1000~3000年中所有的闰年,每5年换一行

    C语言 输出1000 3000年中所有的闰年 每5年换一行 题目 分析 代码 题目 编写程序 输出1000 3000年中所有的闰年 每5年换一行 分析 判断闰年的条件为 能被4整除但不能被100整除 或者能被400整除 代码 include
  • 《Vision Transformers: State of the Art and Research Challenges》论文翻译阅读

    作者 Bo Kai Ruan Hong Han Shuai Wen Huang Cheng 概要 Transforme在自然语言处理中取得了巨大的成功 由于Transformer的自注意机制具有强大的能力 研究人员开发vision tran
  • C++ 聚合类(Aggregate Class)

    C 聚合类 Aggregate Class 文章目录 C 聚合类 Aggregate Class 概述 聚合类定义 聚合类的特性 value initialized 聚合类的初始化方法 union 聚合 总结 概述 该篇文章是用于梳理在学习