相当惊讶地发现之前没有问过这个问题。实际上,它之前已被问过,但我的问题非常不同。它们太复杂和荒谬,而我会保持简单和重点。这就是为什么这个问题需要发布的原因。
现在,当我这样做时,
struct A {
int a = -1;
};
我收到以下错误:
ANSI C++ forbids in-class initialization of non-const static member a
现在,根据解决方法,有人可以告诉我使用默认值初始化struct成员变量的最佳方法吗?
答案 0 :(得分:3)
首先,让我们看一下错误:
ANSI C++ forbids in-class initialization of non-const static member a
初始化一个真实实例成员,它驻留在结构实例的内存中,这是该结构体构造函数的责任。
静态成员虽然在特定类/结构类型的定义中定义,但实际上并不作为此特定类型的任何实例的成员驻留。因此,它不需要解释在构造函数体中分配它的值。这是有道理的,我们不需要这种类型的任何实例来静态成员进行良好初始化。
通常,人们在构造函数中编写成员初始化,如下所示:
struct SomeType
{
int i;
SomeType()
{
i = 1;
}
}
但这实际上不是初始化,而是分配。当您输入构造函数的主体时,您所做的是default-initialize成员。在类似int的基本类型的情况下,"默认初始化"基本上归结为" 呃,只要使用我给你的那些字节中的任何值。"
接下来发生的事情是你要求我现在通过赋值运算符采用值1。对于像这样的琐碎阶级,差异是难以察觉的。但是当你有const成员(显然不能在构建它们时用新值来踩踏),以及更复杂的成员,这些成员不能默认初始化(因为他们不能使可见的构造函数为零)参数),您很快就会发现无法获得编译代码。
正确的方法是:
struct SomeType
{
int i;
SomeType() : i(1)
{
}
}
这样您就可以初始化成员而不是分配成员。您可以通过逗号分隔它们来初始化多个。需要注意的是,它们是按照结构中声明的顺序初始化的,而不是如何在此表达式中对它们进行排序。
有时您可能会看到使用大括号初始化的成员(类似i{1}
而不是i(c)
)。差异可能很微妙,大部分时间都是相同的,标准的当前修订试图消除一些皱纹。但这都超出了这个问题的范围。
更新: 请记住,您尝试编写的内容现在是有效的C ++代码,并且自从批准C ++ 11以来就一直存在。该功能被称为"非静态数据成员初始化器",我怀疑您正在使用某些版本的Visual Studio,它仍然将支持列为" Partial"对于这个特殊功能。可以把它想象成我之前描述的成员初始化语法的简写形式,自动插入您为此特定类型声明的任何构造函数中。
答案 1 :(得分:-1)
您可以创建默认构造函数
struct A {
A() : a{-1} {}
int a;
};