c语言编程笔录

首页 >   > 笔记大全

笔记大全

C聚合体初始化的方法是什么

更新时间:2023-12-19

什么是C++聚合体?

C++聚合体(Aggregate)是指一种特殊的数据类型,它可以将多个其他类型的数据成员组合成一个整体。一个聚合体可以被一次性的初始化,这意味着在定义聚合体的同时,可以初始化所有的成员。

聚合体初始化方法

C++中,聚合体支持多种初始化方法。其中最常见的是使用花括号 {} 或者圆括号 () 来初始化每一个成员,这种方法也叫做列表初始化。

// 用花括号初始化聚合体  
struct Student {
  int age;
  double score;
  std::string name;
};
  
Student s = {18, 90.5, "Tom"};

// 用圆括号初始化聚合体
Student s2(18, 90.5, "Tom");

聚合体初始化规则

聚合体的初始化有一些规则需要遵循:

  • 所有的非静态成员都必须能够被初始化。
  • 初始化的顺序和定义的顺序一致。
  • 如果成员被初始化了,那么默认构造函数就不会被调用。
  • 如果没有为每个成员都提供初始化值,则未初始化的成员将被设置为零或默认值。

聚合体与非聚合体的区别

C++中并不是所有的结构体都是聚合体,只有满足一定条件的结构体才能被称为聚合体。以下是判断一个结构体是否为聚合体的规则:

  • 结构体没有定义任何构造函数。
  • 结构体没有基类(继承其他类)。
  • 结构体没有虚函数。
  • 结构体的所有非静态成员都是公有的。
  • 结构体没有引用类型的成员。
// 聚合体
struct Student {
  int age;
  double score;
  std::string name;
};
Student s = {18, 90.5, "Tom"}; // 正确,可以初始化
  
// 非聚合体
struct Teacher {
  int age;
  double score;
  std::string name;
  Teacher() {} // 定义了构造函数会导致非聚合体
};
Teacher t{18, 80.5, "Jack"}; // 错误,无法使用列表初始化

总结

C++聚合体相对于其他的数据类型具有独特的优势,能够将多个数据成员组合成一个整体,通过一次性的初始化来完成数据成员的定义和初始化。聚合体的初始化方法包括花括号初始化和圆括号初始化,初始化规则包括所有非静态成员都必须能够被初始化、初始化的顺序和定义的顺序一致、如果成员被初始化了,那么默认构造函数就不会被调用、如果没有为每个成员都提供初始化值,则未初始化的成员将被设置为零或默认值。只有在结构体满足一定条件的情况下,才能被认为是C++聚合体,这些条件包括没有定义任何构造函数、没有基类、没有虚函数、所有非静态成员都是公有的、没有引用类型的成员。