【问题标题】:Initializing const c++ class without constructor在没有构造函数的情况下初始化 const c++ 类
【发布时间】:2017-07-14 19:57:23
【问题描述】:

我有一个在联合中使用的类,因此不能有 (non-trivial) 构造函数。我需要创建一个类的 const 实例,可以这样做吗?

即:

 class Foo {
     // no constructors...
     private:
         int i;
 };

 union {
     Foo foo;
     Bar bar;
 } FooBar;

 const Foo defaultFoo = ???

【问题讨论】:

  • 从 C++11 标准开始,您可以拥有具有非平凡构造函数的对象实例。参见例如this union reference for details.
  • 不幸的是,我使用的是旧版本的 C++,它不支持联合中的构造函数。
  • 成员必须是私有的吗?
  • 我绝对更喜欢私人会员......实际上它是一个相当大而复杂的类......
  • 你可以有一个返回Foo实例的静态成员函数。没有显式构造函数意味着您仍然应该使用编译器提供的复制构造函数。 static Foo createFoo(int i) { Foo f; f.i = i; return f; } ... const Foo defaultFoo = Foo::createFoo(1234);

标签: c++ constructor c++03


【解决方案1】:

是的,您可以从函数的结果中复制构造它:

static Foo configureDefaultFoo()
{
    Foo f; // not const
    f.setI(42); // call non-const member functions
    return f;
}

const Foo defaultFoo = configureDefaultFoo();

请注意,虽然这会导致对象为 const,但它是动态初始化而不是静态的,因此它可能会遭受静态初始化顺序的失败(如果调用非平凡的构造函数也是如此,仅聚合初始化将避免惨败)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2022-01-12
    • 2021-04-29
    相关资源
    最近更新 更多