我有C++代码,可以归结为以下内容:

class Foo{
    bool bar;
    bool baz;
    Foo(const void*);
};
Foo::Foo(const void* ptr){
    const struct my_struct* s = complex_method(ptr);
    bar = calculate_bar(s);
    baz = calculate_baz(s);
}

从语义上讲,bar和baz成员变量应为const,因为它们在初始化后不应更改。但是,为了使它们看起来如此,我需要在初始化列表中对其进行初始化,而不是为其分配它们。明确地说,我理解为什么我需要这样做。问题是,如果不执行以下不良操作之一,我似乎找不到任何方法将代码转换为初始化列表:
  • 两次调用complex_method(对性能不利)
  • 添加指向Foo类的指针(会使类的大小不必要地变大)

  • 有什么办法可以在避免这些不良情况的同时使变量为const?

    最佳答案

    如果您负担得起C++ 11编译器,请考虑delegating constructors:

    class Foo
    {
        // ...
        bool const bar;
        bool const baz;
        Foo(void const*);
        // ...
        Foo(my_struct const* s); // Possibly private
    };
    
    Foo::Foo(void const* ptr)
        : Foo{complex_method(ptr)}
    {
    }
    
    // ...
    
    Foo::Foo(my_struct const* s)
        : bar{calculate_bar(s)}
        , baz{calculate_baz(s)}
    {
    }
    

    作为一般建议,请小心地将数据成员声明为const,因为这使您的类无法进行复制分配和移动分配。如果应该将您的类与值语义一起使用,则需要执行这些操作。如果不是这种情况,则可以忽略此注释。

    关于c++ - 初始化const成员变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28030837/

    10-13 08:24
    查看更多