我刚刚在第298页的 C ++ Primer (第5版)中阅读了以下定义:
在以下情况下,类是聚合:
所有数据成员都是公开的
它没有定义任何构造函数
它没有类内初始化程序
它没有基类或虚函数
此帖中还提供了一个定义:What are Aggregates and PODs and how/why are they special?。
毕竟我在本书的前几节中读到了封装的价值,我想知道:为什么有人想要使用聚合类? (顺便说一句,这个问题似乎一般适用于struct
:为什么我希望默认拥有public:
?)
答案 0 :(得分:7)
聚合基本上是一个简单的数据集合,它没有class
必须保证的任何不变量。由于没有不变量,因此成员的可能值的所有组合都是有意义的,所以没有必要将它们设为私有,因为没有什么可以保护的。
这样一个类的一个简单例子就像是
struct Point3d {
std::array<double, 3> coordinates;
};
由于double
的每个三元组都是R ^ 3中的一个点,因此隐藏数据无法获得任何结果。 (如果您害怕NaN
和infinity
值,这可能不是最好的主意。如果发生这种情况,您可能不希望将其作为聚合。)
聚合类型的另一个例子是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;他们(通过聚合中的成员名称)