C++结构体初始化方法

在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结。



直接赋值

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
};

int main()
{
    // 第1种方法
    Date date1;
    date1.year = 2022;
    date1.month = 7.0;
    date1.day = "22";
    cout<<date1.year<<" "<<date1.month<<" "<<date1.day<<endl;

    // 第2种方法
    Date date2 = {2022, 7.0, "22"}; // 顺序赋值
    cout<<date2.year<<" "<<date2.month<<" "<<date2.day<<endl;
    return 0;
}

如果只是想全部初始化为 0 可以按照如下方法

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
};

int main()
{
    // 第一种方法
    Date date1 = {}; // 初始完后字符串为空串
    cout<<date1.year<<" "<<date1.month<<" "<<date1.day<<endl; // 0 0

    // 第二种方法 (注意只有0能将所有变量初始化为0,使用其他数字只能将第一个数初始化为1其他仍为0)
    Date date2 = {0}; // 初始完后字符串为空串
    cout<<date2.year<<" "<<date2.month<<" "<<date2.day<<endl; // 0 0
    return 0;
}

结构体包含数组(数组在结构体变量定义完就初始化为0)

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
    int a[10];
};

int main()
{
    Date date2 = {2022, 7.0, "22", {1}}; // 顺序赋值
    cout<<date2.year<<" "<<date2.month<<" "<<date2.day<<" "<<date2.a[0]<<" "<<date2.a[1]<<endl; //2022 7 22 1 0
    return 0;
}


利用函数赋值

直接赋值的方法虽然很直观,但是如果需要初始化多个结构体变量,那么代码量为很多且很冗余,而顺序赋值的方式会因为参数过多而容易出错,因此我们可以利用函数来为结构体变量赋值。

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
    int a[10];
};

Date init( int year, double month, string day)
{
    Date temp;
    temp.year = year;
    temp.month = month;
    temp.day = day;
    memset(a, 0, sizeof(a)); // 需要memst进行初始化,不然a数组不会被初始化为0
    return temp;
}
int main()
{
    Date date = init(2022, 7.0, "22");
    cout<<date.year<<" "<<date.month<<" "<<date.day<<" "<<date.a[0]<<endl; // 2022 7 22 0
    return 0;
}

需要注意的是,结构体=结构体是浅拷贝,简单变量没问题,动态分配的变量会出问题。


构造函数初始化

引言提到,在 c++ 中可以将结构体看作没有任何成员函数的对象,因此也可以使用构造函数进行初始化。

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
    int a[10];
    Date()
    {
        year = 2022;
        month = 7.0;
        day = "22";
    }
    Date(int year) //这里可以使用 Date(int year=0) 来指定year默认值,但是这样就不能有Date()
    {
        this->year = year;
        month = 7.0;
        day = "22";
    }
};

int main()
{
    // 默认值初始化
    Date date1;
    cout<<date1.year<<" "<<date1.month<<" "<<date1.day<<" "<<date1.a[0]<<endl; // 2022 7 22 0

    // 指定一个值
    Date date2(2022);
    cout<<date2.year<<" "<<date2.month<<" "<<date2.day<<" "<<date2.a[0]<<endl; // 2022 7 22 0
    return 0;
}

当然除了指定一个 year, 我们也可以指定 month、day 等,这里就不详细展开了。
我们可以用冒号操作来简化构造函数的写法。

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    double month;
    string day;
    int a[10];
    Date() : year(2022),month(7.0),day("22"){}
    Date(int year) : year(year),month(7.0),day("22") {}//这里可以使用 Date(int year=0) 来指定year默认值,但是这样就不能有Date()
};

int main()
{
    // 默认值初始化
    Date date1;
    cout<<date1.year<<" "<<date1.month<<" "<<date1.day<<" "<<date1.a[0]<<endl; // 2022 7 22 0

    // 指定一个值
    Date date2(2022);
    cout<<date2.year<<" "<<date2.month<<" "<<date2.day<<" "<<date2.a[0]<<endl; // 2022 7 22 0
    return 0;
}

  • 16
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值