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

更新: 在这种情况下,必须使用 { } 而不是 ( )