聚合类相对于常规类的优势[重复]

Posted

技术标签:

【中文标题】聚合类相对于常规类的优势[重复]【英文标题】:Advantages of aggregate classes over regular classes [duplicate] 【发布时间】:2022-01-14 01:12:58 【问题描述】:

在我的用例中,我需要使用初始化列表来初始化一个类变量。我了解到聚合类是一个只有用户定义的数据成员的类。

聚合的好处是我们可以像这样使用初始化列表

struct fileJobPair 
        int file;
        int job;
;

fileJobPair obj = 10, 20;

但是如果我给它添加一个构造函数,这个类就不再是一个聚合了

struct fileJobPair 
        int file;
        int job;
        fileJobPair() 
            file = job = 0;
        
        fileJobPair(int a, int b) 
            file = a;
            job = b;
        
;

但我看到我们对聚合类的初始化列表优势仍然可以在这里使用。

fileJobPair obj = 10, 20;

所以我的问题是,如果普通课程可以实现相同的目标,为什么我们甚至需要一个聚合。聚合的优点和实际用例是什么。

【问题讨论】:

当你需要与 C 互操作时。 我认为question 是一本好书。 【参考方案1】:

聚合有什么优点<...>

与“普通”类不同,聚合类型:

    具有预定义的“构造函数”(您的示例) 结构化绑定不需要类似元组的接口样板:
struct  int field1, field2;  aggregate;
auto&& [_1, _2] = aggregate;
    有指定的初始化器:
Aggregate.something = 42, .something_else = "whatever";

也许还有一些我没有想到的事情。

聚合的<...>现实生活用例是什么

例如由于#2,您可以(反)序列化它们而无需样板,另请参阅Boost.PFR。您可以轻松地合并它们(如元组)、“foreach”它们的字段等。

#3 的示例:将大量 Builder 模式代码替换为

struct Foo 
  struct Builder  std::string_view a, b, c; ;
  constexpr Foo(Builder); // TODO
 example.a = "cannot set a field twice", .c = "can skip fields";

普通班也能达到同样的效果

如您所见,它不能或需要额外的样板。

【讨论】:

以上是关于聚合类相对于常规类的优势[重复]的主要内容,如果未能解决你的问题,请参考以下文章

bigtable 反向时间戳相对于常规时间戳的优势

(有没有)python socketserver 相对于常规套接字对象的性能优势?

Java中抽象和多态的优势[重复]

如何使其适用于 html 表中特定类的转换持续时间 [重复]

UML 图帮助(聚合/组合)[重复]

Singleton类的优势是啥? [复制]