c ++:初始化结构的正确方法
c++: Proper way of initializing struct
假设我想将 x 和 y 都初始化为 0。在 C 的初始化列表中初始化 B 的最佳方法是什么?我对 C++03 的实现方式更感兴趣。
typedef struct A
{
int x, y;
} A;
typedef struct B
{
A a;
} B;
class C
{
public:
C();
private:
B b;
};
--------
C::C(): b(??) {}
就这么简单:
C::C() : b() {}
请注意,您不需要 C++ 中的 typedef struct
技巧。 struct Name {blah};
够了。
你的typedef struct
太多了C-style
,你在C++中不需要。
无论如何,struct
可以包含一个 非默认 构造函数。
Here一个活生生的例子。
没有默认构造函数的结构:
struct A {
A(int _x = 0, int _y = 0) : x(_x), y(_y) { }
int x, y;
};
struct B {
A a;
B(int x = 0, int y = 0) : a(x, y) { }
};
使用默认参数 B::B()
将构造一个带有 [x = 0; y = 0]
的对象。
在 C++03 中,您可以在 A 和 B 构造函数中定义两个整数。在 C 中,您调用 B 构造函数,它只是将参数转发给 A 的构造函数。
在您的示例中,A 和 B 结构的行为都像 PODs - 具有默认构造函数和复制赋值的对象以及明显微不足道的析构函数。
在这种情况下,C++ 允许通过将参数直接传递给成员来初始化这些对象(不使用用户定义的构造函数)。
例如:
A a1; // x and y initialized with default values (0 for int)
A a2{2}; // x initialized with 2, y with default
A a3{2, 4}; // x initialized with 2, y with 4
这也适用于 C++ 风格的结构(没有 typedef 等)。
看这里http://en.cppreference.com/w/cpp/types/is_pod
更新:
在这种情况下,必须使用 { } 而不是 ( )
假设我想将 x 和 y 都初始化为 0。在 C 的初始化列表中初始化 B 的最佳方法是什么?我对 C++03 的实现方式更感兴趣。
typedef struct A
{
int x, y;
} A;
typedef struct B
{
A a;
} B;
class C
{
public:
C();
private:
B b;
};
--------
C::C(): b(??) {}
就这么简单:
C::C() : b() {}
请注意,您不需要 C++ 中的 typedef struct
技巧。 struct Name {blah};
够了。
你的typedef struct
太多了C-style
,你在C++中不需要。
无论如何,struct
可以包含一个 非默认 构造函数。
Here一个活生生的例子。
没有默认构造函数的结构:
struct A {
A(int _x = 0, int _y = 0) : x(_x), y(_y) { }
int x, y;
};
struct B {
A a;
B(int x = 0, int y = 0) : a(x, y) { }
};
使用默认参数 B::B()
将构造一个带有 [x = 0; y = 0]
的对象。
在 C++03 中,您可以在 A 和 B 构造函数中定义两个整数。在 C 中,您调用 B 构造函数,它只是将参数转发给 A 的构造函数。
在您的示例中,A 和 B 结构的行为都像 PODs - 具有默认构造函数和复制赋值的对象以及明显微不足道的析构函数。 在这种情况下,C++ 允许通过将参数直接传递给成员来初始化这些对象(不使用用户定义的构造函数)。 例如:
A a1; // x and y initialized with default values (0 for int)
A a2{2}; // x initialized with 2, y with default
A a3{2, 4}; // x initialized with 2, y with 4
这也适用于 C++ 风格的结构(没有 typedef 等)。 看这里http://en.cppreference.com/w/cpp/types/is_pod
更新: 在这种情况下,必须使用 { } 而不是 ( )