我有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
(对性能不利)有什么办法可以在避免这些不良情况的同时使变量为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/