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

简介: 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";   // 输出 true
    std::cout << std::is_aggregate_v<Person> << "\n";  // 输出 false
    return 0;
}

Point是聚合类型

Person不是聚合类型

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

好了 本篇文章就到这里

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

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

相关文章
|
1月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
250 64
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
105 59
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
30天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(三)
【C++】面向对象编程的三大特性:深入解析继承机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(二)
【C++】面向对象编程的三大特性:深入解析继承机制
|
1月前
|
安全 程序员 编译器
【C++】面向对象编程的三大特性:深入解析继承机制(一)
【C++】面向对象编程的三大特性:深入解析继承机制