C++新特性 扩展和聚合类型

本篇文章我们来讲一下扩展和聚合类型

1.聚合类型的定义:

在计算机编程中,聚合类型是一种将多个数据元素组合到一个单独的数据结构中的方式。它可以包含不同类型的数据,并且这些数据可以按照特定的顺序或规则进行组织。

常见的聚合类型有数组、结构体和类等。下面简要介绍一些常见的聚合类型:

  1. 数组(Array):数组是相同类型元素的集合,通过索引访问其中的元素。

  2. 结构体(Struct):结构体是用户自定义的复合数据类型,可以包含不同类型的成员变量,通过点运算符访问各个成员。

  3. 类(Class):类也是用户自定义的复合数据类型,类似于结构体,但可以包含方法和属性,并支持继承和封装等面向对象特性。

  4. 枚举(Enumeration):枚举是一种有限集合值列表,用于表示一组相关常量。每个枚举值都有一个与之关联的整数或字符值。

  5. 联合体(Union):联合体允许在相同内存位置存储不同类型的变量,但只能同时使用其中一种。

这些聚合类型可根据需要灵活地组织和管理数据,在程序设计中起着重要作用。

下面我们来看一下聚合类型的新定义 C++17及以上

聚合类型所需要的条件

1.没有用户提供的构造函数(如果是基类派生出派生类的话 则派生类可以有构造函数)

2.没有私有和受保护的非静态数据成员

3.没有虚函数

如果类涉及到继承  额外满足条件:

1.必须是公开的基类 不能是私有或者是受保护的基类

2.不能是虚继承

基类是非聚合类型的情况下 派生类也可能是聚合类型

代码实例:

#include <iostream>class Base {
public:int x;};struct Derived : public Base {int y;
};int main() {Derived d{1, 2};std::cout << "Derived - x: " << d.x << ", y: " << d.y << std::endl;return 0;
}

 


禁止聚合类型使用用户声明的构造函数 尤其是显示制定默认或者显示删除构造函数也都是不行

代码实例:

#include <iostream>
using namespace std;
struct X
{X() = default;
};
struct Y
{Y() = delete;
};

以上代码这两个结构体都是非聚合类型的结构体

1 结构体显示的指定了编译器生成的默认构造函数

2结构体显示的删除了默认构造函数 这些都是不认可的 

使用小括号的列表初始化聚合类型对象

在C++17之前 使用()初始化聚合类型是不可以的 因为之前小括号初始化会默认优先查找构造函数而不是 但是在C++17以后 可以采用小括号初始化

看一下代码实例:

#include <iostream>
using namespace std;
struct X
{int i;float f;
};int main()
{;;;X x{ 10,7.0f };X c(10, 5.0f);return 0;
}

注意 小括号的初始化支持缩窄转换

 

最后 介绍一下C++ is_aggregate_v这个函数

is_aggregate_v 是一个C++模板元编程中的特性,用于判断给定的类型是否是一个聚合类型(aggregate type)。它是在C++17标准中引入的。这个特性可以通过 std::is_aggregate 类模板来实现。

代码实例:

#include <iostream>
#include <type_traits>struct Point {int x;int y;
};struct Person {std::string name;int age;
};int main() {std::cout << std::boolalpha;std::cout << std::is_aggregate_v<Point> << "\n";   // 输出 truestd::cout << std::is_aggregate_v<Person> << "\n";  // 输出 falsereturn 0;
}

Point是聚合类型

Person不是聚合类型

std::string 是一个复杂类型,它具有自己的默认构造函数和析构函数,并且需要进行动态内存管理。按照C++标准规定,如果一个结构体拥有任何非静态数据成员需要进行默认初始化,则该结构体不再符合聚合类型定义。

好了 本篇文章就到这里 

在这里小编想给大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人抓取 [ 题目/摘要 ] 更新中..

题目&#xff1a;Robotic Grasping of Novel Objects using Visionl 链接&#xff1a;机器人抓取新物体 | IEEE Xplore&#xff08;IEEE的Xplore&#xff09; 【端到端】 摘要&#xff1a;我们考虑抓取新物体的问题&#xff0c;特别是第一次通过视觉看到的物体。抓取以前未知的…

在线JSON转SQL工具

在线JSON转SQL - BTool在线工具软件&#xff0c;为开发者提供方便。在线JSON转SQL工具可以将JSON文件中的数据或者JSON对象转换为SQL插入语句&#xff0c;方便用户将数据导入到数据库中。用户可以通过简单的界面上传JSON文件&#xff0c;或者文本框输入&#xff0c;点击JSON转S…

Python 处理小样本数据的文档分类问题

在处理小样本数据的文档分类问题时&#xff0c;可以尝试使用迁移学习或者基于预训练模型的方法&#xff0c;如BERT、GPT等。然而&#xff0c;直接在这里编写一个完整的深度学习文档分类代码超出了这个平台的限制&#xff0c;但我可以为你提供一个基本的思路和简单示例&#xff…

【微信小程序】微信小程序开发:从入门到精通

微信小程序开发&#xff1a;从入门到精通 一、开发准备二、小程序开发流程1、注册与创建项目2、开发页面3、配置4、调试与预览5、发布与审核 随着移动互联网的普及&#xff0c;微信小程序成为了越来越多企业和个人开发者的首选。小程序是一种无需下载安装即可使用的应用&#x…

Redis——SpringBoot整合Redis实战

1、基本配置 1.1、引入依赖 首先&#xff0c;建立Maven项目&#xff0c;在Maven项目中引入pom.xml文件&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &l…

计算机网络_1.6.3 计算机网络体系结构分层思想举例

1.6.3 计算机网络体系结构分层思想举例 1、实例引入&#xff08;用户在主机中使用浏览器访问web服务器&#xff09;2、从五层原理体系结构的角度研究该实例3、练习题 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节通过一个常见的网络应用实例&#xff0c;来介绍计…

灵活应对:策略模式在软件设计中的应用

策略模式是一种行为型设计模式&#xff0c;它允许定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端&#xff0c;使得在不修改原有代码的情况下切换或扩展新的算法成为可能。 使用策略模式的场景包…

android inset 管理

目录 简介 Insets管理架构 Insets相关类图 app侧的类 WMS侧的类 inset show的流程 接口 流程 WMS侧确定InsetsSourceControl的流程 两个问题 窗口显示时不改变现有的inset状态 全屏窗口上的dialog 不显示statusbar问题 View 和 DecorView 设置insets信息 输入法显…

系统架构-性能评估

系统架构-性能评估&#xff1a; 性能评估是系统架构和技术设计中的关键环节&#xff0c;它关注的是系统的运行效率、处理能力以及在不同负载条件下的响应时间和资源利用情况。以下是对系统性能评估的详细介绍&#xff1a; 1 响应时间&#xff08;Response Time&#xff09;&am…

德迅云安全教您如何辨别高性能服务器

IDC行业的快速发展让IDC服务商日益增多&#xff0c;服务器市场时常出现鱼龙混杂的情况。一台高性能服务器对于网站运营来说是可起到很好的帮助&#xff0c;可服务器对种多样&#xff0c;怎样才能找到服务器性能好的呢&#xff1f; 下面跟德迅云安全一起来判断一下。怎么辨别高…

jQuery---获取元素的个数

介绍 使用jQuery获取元素的个数。 示例 $(".optBtn").length

幻兽帕鲁客户端存档文件 - 云上备份和恢复教程

本文将详细介绍如何将幻兽帕鲁游戏客户端的存档文件备份至云端&#xff0c;以及如何从云端恢复存档数据至本地。 一、游戏存档备份场景 幻兽帕鲁的游戏进度存储在电脑本地磁盘上&#xff0c;游戏中创建的每个世界都对应一个本地存档文件夹。在玩游戏过程中&#xff0c;客户端…

智能边缘计算网关实现高效数据处理与实时响应-天拓四方

在当今时代&#xff0c;数据已经成为驱动业务决策的关键因素。然而&#xff0c;传统的数据处理方式往往存在延迟&#xff0c;无法满足实时性要求。此时&#xff0c;智能边缘计算网关应运而生&#xff0c;它能够将数据处理和分析的能力从中心服务器转移至设备边缘&#xff0c;大…

架构篇32:可扩展架构的基本思想和模式

文章目录 前言可扩展的基本思想可扩展方式小结前言 软件系统与硬件和建筑系统最大的差异在于软件是可扩展的,一个硬件生产出来后就不会再进行改变、一个建筑完工后也不会再改变其整体结构。 例如,一颗 CPU 生产出来后装到一台 PC 机上,不会再返回工厂进行加工以增加新的功…

基于单片机控制的智能门锁设计

摘要&#xff1a;阐述基于STC15F2K60S2单片机控制的智能门锁设计&#xff0c;包括CPU控制单元模块、液晶显示LCD、 Wi-Fi模块&#xff0c;实现远程控制开门&#xff0c;密码开门的智能化功能。 关键词&#xff1a;控制技术&#xff0c;单片机&#xff0c;智能门锁&#xff0c;…

游戏视频录制软件推荐,打造专业电竞视频(3款)

随着游戏产业的快速发展&#xff0c;越来越多的玩家开始关注游戏视频录制软件。一款好的录制软件不仅可以帮助玩家记录游戏中的精彩瞬间&#xff0c;还可以让其与他人分享自己的游戏体验。接下来&#xff0c;我们将介绍三款热门的游戏视频录制软件&#xff0c;并对其进行详细的…

深度学习本科课程 实验2 前馈神经网络

任务 3.3 课程实验要求 &#xff08;1&#xff09;手动实现前馈神经网络解决上述回归、二分类、多分类任务 l 从训练时间、预测精度、Loss变化等角度分析实验结果&#xff08;最好使用图表展示&#xff09; &#xff08;2&#xff09;利用torch.nn实现前馈神经网络解决上述回归…

收放卷转动线速度计算FC(SCL+梯形图代码)

这篇博客是收放控制算法的基础系列,通过这篇文章的学习。大家能更好的理解收放卷控制里的前馈量计算,收放卷前馈PID大家可以参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/129352629https://rxxw-control.blog.csdn.net/article/details/12935262…

3D Line Mapping Revisited论文阅读

1. 代码地址 GitHub - cvg/limap: A toolbox for mapping and localization with line features. 2. 项目主页 3D Line Mapping Revisited 3. 摘要 提出了一种基于线的重建算法&#xff0c;Limap&#xff0c;可以从多视图图像中构建3D线地图&#xff0c;通过线三角化、精心…

06、全文检索 -- Solr -- Solr 全文检索之在图形界面管理 Core 的 Schema(演示对 普通字段、动态字段、拷贝字段 的添加和删除)

目录 Solr 全文检索之管理 Schema使用Web控制台管理Core的Schema3 种 字段解释&#xff1a;Field&#xff1a;普通字段Dynamic Field&#xff1a;动态字段Copy Field&#xff1a;拷贝字段 演示&#xff1a;添加 普通字段&#xff08; Field &#xff09;演示&#xff1a;添加 动…