【问题标题】:Idiom to initialize C++ class to zero将 C++ 类初始化为零的习惯用法
【发布时间】:2017-04-19 03:22:54
【问题描述】:

考虑以下 C++ 类:

struct Point
{
    int x;
    int y;

    explicit Point() =default; // 1
    explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};

第二个构造函数对于创建具有特定xy 值的Point 很有用。第一个存在以便我可以默认构造一个Point。但是,为了提高效率,它是defaulted,并且不会将xy 设置为零。如果我确实想将所有成员设置为零,我可以有另一个构造函数:

explicit Point(int val) : x(val), y(val) { } // 3

这样,我可以选择默认初始化Point,或者将其初始化为所有成员都设置为零:

Point p1;    // Don't initialize members.
Point p2(0); // Initialize all members to zero.

第三个构造函数的问题是我真的可以传递任何值,而不仅仅是零。例如:

Point p(1); // Both x and y set to 1! Is this the intent? If so,
            // probably should have used Point p(1, 1) instead.

另一种方法是使用表示零或默认值的特殊类型并将其传递给构造函数:

explicit Point(Default) : x(0), y(0) { } // 4

其中Default可以简单定义为:

struct Default { };

然后,我可以控制何时使用默认值初始化 Point

Point p1;            // Don't initialize members.
Point p2(Default()); // Initialize members with default values.

哪种方法更好,标记类型为Default 的方法(第 4 种),还是采用单个值并将所有成员初始化为该值的构造函数(第 3 种)?这两种方法的优缺点是什么?还是有其他更好的机制来做到这一点?

编辑:请注意,选择这个简单的类是为了说明;实际上,可能有更多的成员需要特定的默认值才能被视为“已初始化”

【问题讨论】:

  • 注意,你也可以使用值初始化。 Point p{};.

标签: c++ initialization zero idioms construction


【解决方案1】:

让你的生活更轻松,让简单的数据结构像这样聚合:

struct Point
{
    int x;
    int y;
};

现在你可以使用聚合初始化了:

Point p;      // members uninitialized
Point p{};    // members set to 0
Point p{1,2}; // members set to 1,2

【讨论】:

    【解决方案2】:

    我看到的最常见的做法是使用初始化列表实现无参数构造函数,其中包含设置为您想要的任何默认值的类的每个成员。

    Point(): x(0), y(0) { }
    

    这背后的原因是,您可能永远不想在不将成员初始化为某个已知值的情况下实例化一个对象,因此您实际上并不希望该默认构造函数存在。

    【讨论】:

    • 我认为这是std::complex所采用的方法。
    【解决方案3】:

    另一种选择是使用:

    struct Point
    {
        int x;
        int y;
    
        explicit Point(int x_ = 0, int y_ = 0): x(x_), y(y_) {}
    };
    
    Point p1;        // 0, 0
    Point p2(1);     // 1, 0
    Point p3(1, 10); // 1, 10
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2010-12-26
      • 1970-01-01
      • 2012-03-10
      • 2011-07-21
      相关资源
      最近更新 更多