什么是聚合类?

时间:2015-07-05 16:07:43

标签: c++

我刚刚在第298页的 C ++ Primer (第5版)中阅读了以下定义:

  

在以下情况下,类是聚合:

     
      
  • 所有数据成员都是公开的

  •   
  • 它没有定义任何构造函数

  •   
  • 它没有类内初始化程序

  •   
  • 它没有基类或虚函数

  •   

此帖中还提供了一个定义:What are Aggregates and PODs and how/why are they special?

毕竟我在本书的前几节中读到了封装的价值,我想知道:为什么有人想要使用聚合类? (顺便说一句,这个问题似乎一般适用于struct:为什么我希望默认拥有public:?)

2 个答案:

答案 0 :(得分:7)

聚合基本上是一个简单的数据集合,它没有class必须保证的任何不变量。由于没有不变量,因此成员的可能值的所有组合都是有意义的,所以没有必要将它们设为私有,因为没有什么可以保护的。

这样一个类的一个简单例子就像是

struct Point3d {
   std::array<double, 3> coordinates;
};

由于double的每个三元组都是R ^ 3中的一个点,因此隐藏数据无法获得任何结果。 (如果您害怕NaNinfinity值,这可能不是最好的主意。如果发生这种情况,您可能不希望将其作为聚合。)

聚合类型的另一个例子是std::array。同样,它只是一个类型和一些(不可变)长度的数组,因此没有不变的保护。

聚合的一个优点是aggregate initialization

答案 1 :(得分:4)

可以使用初始化列表初始化聚合类:

class Agg {
    string a;
    int b;
}
Agg a = {"A string", 0};

它们主要用作类似tupple的返回值,如下所示:

class Response {
    bool success;
    string body; // Body is only set if success is true
}

Response foo() {
    if(failed) return {false, ""};
    return {true, "content"};
}

正如你所看到的那样,必须满足所有这四个要求才有意义(在c ++ 11之前)。

  

所有数据成员都是公开的

它几乎只是一堆物体。

  

它没有定义任何构造函数

好吧,要么初始化所有成员(通过聚合初始化),要么默认初始化所有成员(使用默认构造函数)。

  

它没有类内初始化程序

与上述相同

  

它没有基类或虚函数

它类似于tupple,所以基类会破坏它,虚拟功能没有意义,因为你不会从这样的类中继承。

我希望这有点清除它。请记住,这是在C ++ 11之前发明的,其中std::tuple不存在,因此您将使用聚合类来返回多个值。如今在大多数用例中你都可以使用tuple,但这不是我最喜欢的。

std::tuple vs聚合类

  • 聚合类可以定义成员函数
  • 聚合类可以重载运算符。
  • 聚合可以为其属性定义有用的名称
  • 等..扩展

大多数情况下,聚合课程是要走的路。只有当你真的不需要别的东西而是返回一个对象元组时,才应该使用元组,然后将它分解成片段#34;成员函数在大多数情况下都没有意义,但聚合类仍然可以使转换运算符超载。例如。

只有当你只是想做什么,而只是将一堆对象重新组合在一起时才使用元组,而不需要&#34; name&#34;他们(通过聚合中的成员名称)