c++结构体的两种初始化方法---初始化列表/构造函数

初始化结构体

  • 初始化列表
  • 构造函数

当定义结构体变量时,可以通过两种方式初始化它:使用初始化列表或构造函数

初始化列表

初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。

例如,假设已经声明了以下 Date 结构体:

struct Date
{
     
    int day, month, year;
};

定义和初始化 Date 变量的方式是:先指定变量名,后接赋值运算符和初始化列表,如下所示:

Date birthday = {
     23, 8, 1983};

该声明定义 birthday 是一个 Date 结构体的变量,大括号内的值按顺序分配给其成员。所以 birthday 的数据成员已初始化,如图 2 所示:
c++结构体的两种初始化方法---初始化列表/构造函数_第1张图片
也可以仅初始化结构体变量的部分成员。例如,如果仅知道要存储的生日是8月23日, 但不知道年份,则可以按以下方式定义和初始化变量:

Date birthday = {
     23,8};

这里只有 day 和 month 成员被初始化,year 成员未初始化。但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为未初始化。使用初始化列表时,C++ 不提供跳过成员的方法。以下语句试图跳过 month 成员的初始化。这是不合法的。

Date birthday = {
     23,1983}; //非法

还有一点很重要,不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:

//非法结构体声明
struct Date
{
     
    int day = 23,
    month = 8,
    year = 1983;
}

因为结构体声明只声明一个结构体“看起来是什么样子的”,所以不会在内存中创建成员变量。只有通过定义该结构体类型的变量来实例化结构体,才有地方存储初始值。

构造函数

虽然初始化列表易于使用,但它有两个缺点:

  1. 如果有某个成员未被初始化,那么在这种情况下,跟随在该成员后面的成员都不能初始化。
  2. 如果结构体包括任何诸如字符串之类的对象,那么在许多编译器上它都将无法运行。

在这些情况下,可以使用构造函数来初始化结构体成员变量,这和初始化类成员变量是相同的。与类构造函数一样,结构体的构造函数必须是与结构体名称相同的公共成员函数,并且没有返回类型。因为默认情况下,所有结构体成员都是公开的,所以不需要使用关键字 public。

以下是一个名为 Employee 的结构体的声明语句,它包含一个具有两参数的构造函数,以便在创建一个 Employee 变量而不向其传递任何参数时,提供默认值:

struct Employee
{
     
    string name;    // 员工姓名
    int vacationDays,    // 允许的年假
    daysUsed;    //已使用的年假天数
    Employee (string n ="",int d = 0)    // 构造函数
    {
     
        name = n;
        vacationDays = 10;
        daysUsed = d;
    }
};

在建立结构体数组时,如果只写了带参数的构造函数将会出现数组无法初始化的错误
下面是一个比较安全的带构造的结构体示例

Copy
struct node{
     
    int data;
    string str;
    char x;
    //注意构造函数最后这里没有分号哦!
  node() :x(), str(), data(){
     } //无参数的构造函数数组初始化时调用
  node(int a, string b, char c) :data(a), str(b), x(c){
     }//有参构造
}N[10];

你可能感兴趣的:(c++,列表,类,编程语言,c++)