是否可以在c++中初始化结构,如下所示:

struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};

address temp_address = { .city = "Hamilton", .prov = "Ontario" };

这里和这里的链接提到,这种样式只能在C中使用。如果是这样,为什么在c++中不能使用呢?是否有任何潜在的技术原因,为什么它不是在c++中实现的,或者使用这种风格是不好的做法。我喜欢使用这种初始化方式,因为我的结构体很大,而且这种样式可以让我清楚地了解分配给哪个成员的值。

请与我分享是否有其他方法可以达到同样的可读性。

在提出这个问题之前,我已参考以下连结:

C/ c++ for AIX C结构初始化变量 c++中使用标记的静态结构初始化 c++ 11正确的结构初始化


当前回答

你可以通过构造函数初始化:

struct address {
  address() : city("Hamilton"), prov("Ontario") {}
  int street_no;
  char *street_name;
  char *city;
  char *prov;
  char *postal_code;
};

其他回答

字段标识符实际上是C初始化式语法。在c++中,只需要按正确的顺序给出值,而不需要字段名。不幸的是,这意味着你需要给他们所有(实际上你可以省略后面的零值字段,结果将是相同的):

address temp_address = { 0, 0, "Hamilton", "Ontario", 0 }; 

它不是在c++中实现的。(同样,char* strings?我希望不会)。

通常情况下,如果你有这么多参数,那就是相当严重的代码味道。但是,为什么不简单地对结构进行值初始化,然后为每个成员赋值呢?

如果你想清楚每个初始化值是什么,只需要把它分成多行,并在每一行上加一个注释:

address temp_addres = {
  0,  // street_no
  nullptr,  // street_name
  "Hamilton",  // city
  "Ontario",  // prov
  nullptr,  // postal_code
};

我知道这个问题很老了,但我找到了另一种初始化的方法,使用constexpr和currying:

struct mp_struct_t {
    public:
        constexpr mp_struct_t(int member1) : mp_struct_t(member1, 0, 0) {}
        constexpr mp_struct_t(int member1, int member2, int member3) : member1(member1), member2(member2), member3(member3) {}
        constexpr mp_struct_t another_member(int member) { return {member1, member, member3}; }
        constexpr mp_struct_t yet_another_one(int member) { return {member1, member2, member}; }

    int member1, member2, member3;
};

static mp_struct_t a_struct = mp_struct_t{1}
                           .another_member(2)
                           .yet_another_one(3);

此方法也适用于全局静态变量,甚至是构造变量。 唯一的缺点是糟糕的可维护性:每次必须使用此方法使另一个成员可初始化时,所有成员初始化方法都必须更改。

我发现这种方式做全局变量,不需要修改原来的结构定义:

struct address {
             int street_no;
             char *street_name;
             char *city;
             char *prov;
             char *postal_code;
           };

然后声明一个继承自原始结构类型的新类型变量,并使用构造函数初始化字段:

struct temp_address : address { temp_address() { 
    city = "Hamilton"; 
    prov = "Ontario"; 
} } temp_address;

虽然没有C风格那么优雅…

对于局部变量,它需要在构造函数的开头添加一个额外的memset(this, 0, sizeof(*this)),所以它显然并不差,@gui13的答案更合适。

(注意,'temp_address'是一个'temp_address'类型的变量,但是这个新类型继承自'address',可以在任何需要'address'的地方使用,所以它是OK的。)