189 c++
我有这个struct:
struct Snapshot
{
double x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
我希望x并且y为0.默认情况下它们是0还是我必须这样做:
Snapshot s = {0,0};
Run Code Online (Sandbox Code Playgroud)
将结构归零的其他方法是什么?
Joh*_*itb 251
如果不初始化结构,它们不为null.
Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members
Run Code Online (Sandbox Code Playgroud)
第二个将使所有成员为零,第一个将它们保留为未指定的值.请注意,它是递归的:
struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members
Run Code Online (Sandbox Code Playgroud)
第二个将p.s.{x,y}为零.如果在结构中有构造函数,则不能使用这些聚合初始化列表.如果是这种情况,则必须为这些构造函数添加适当的初始化
struct Snapshot {
int x;
double y;
Snapshot():x(0),y(0) { }
// other ctors / functions...
};
Run Code Online (Sandbox Code Playgroud)
将x和y初始化为0.请注意,您可以使用x(), y()初始化它们而忽略它们的类型:那就是值初始化,并且通常会产生一个正确的初始值(0表示int,0.0表示double,调用用户定义的默认构造函数具有用户声明的构造函数的类型,...).这非常重要,特别是如果您的结构是模板.
Jar*_*Par 37
不,默认情况下它们不是0.确保所有值或默认为0的最简单方法是定义构造函数
Snapshot() : x(0), y(0) {
}
Run Code Online (Sandbox Code Playgroud)
这可确保快照的所有使用都具有初始化值.
bdo*_*lan 18
一般来说,没有.但是,在函数/中声明为文件范围或静态的结构将被初始化为0(就像这些范围的所有其他变量一样):
int x; // 0
int y = 42; // 42
struct { int a, b; } foo; // 0, 0
void foo() {
struct { int a, b; } bar; // undefined
static struct { int c, d; } quux; // 0, 0
}
Run Code Online (Sandbox Code Playgroud)
And*_*rsK 12
有了POD你也可以写
Snapshot s = {};
Run Code Online (Sandbox Code Playgroud)
你不应该在C++中使用memset,memset的缺点是如果struct中有非POD,它会破坏它.
或者像这样:
struct init
{
template <typename T>
operator T * ()
{
return new T();
}
};
Snapshot* s = init();
Run Code Online (Sandbox Code Playgroud)
在C++中,使用无参数构造函数.在C中你不能有构造函数,所以使用memset或者 - 有趣的解决方案 - 指定初始值设定项:
struct Snapshot s = { .x = 0.0, .y = 0.0 };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135694 次 |
| 最近记录: |