初始化类成员的最佳方式
Best way to initialize class members?
使用c++11标准,我可以用两种方式初始化类成员:
class MyClass
{
private:
int a = 5;
};
或
class MyClass
{
private:
int a;
public:
MyClass()
{
a = 5;
}
};
是否有一种方法因为某种原因优于另一种方法,或者它更像是一种个人风格的选择?
第二个例子是而不是初始化。
因此,在这两个例子中,第一个是初始化类成员的最佳方式。
传统的初始化方式如下:
class MyClass
{
private:
int a;
public:
MyClass()
: a(5)
{}
};
标准c++基金会的这一页建议,在其他条件相同的情况下,您应该更倾向于使用初始化列表。即:
喜欢
class Foo {
public:
Foo(int bar) : m_bar(bar) { }
private:
int m_bar;
};
/
class Foo {
public:
Foo(int bar) {
m_bar = bar;
}
private:
int m_bar;
};
他们的理由是:
考虑下面初始化成员对象
x_
的构造函数使用初始化列表:Fred::Fred() : x_(whatever) { }
。的这样做最常见的好处是提高了性能。为例如,如果表达式whatever与成员类型相同变量x_
,则构造whatever表达式的结果直接在x_
中—编译器不会单独复制对象。即使类型不相同,编译器通常也是使用初始化列表比使用作业。另一种(低效的)构建构造函数的方法是通过赋值,例如:
Fred::Fred() { x_ = whatever; }
。在这种情况下,表达式无论什么原因导致一个单独的临时对象被创建,这将临时对象传递给x_
对象的赋值操作符。然后该临时对象在;
处被析构。这是低效的。如果这还不够糟糕的话,还有另一个低效率的来源在构造函数中使用赋值时:成员对象将得到由其默认构造函数完全构造,这可能是for例如,分配一些默认的内存量或打开一些默认的文件。所有这些工作都可能付诸东流,如果这种表达赋值操作符导致对象关闭该文件和/或释放内存(例如,如果默认构造函数没有分配)内存池足够大或者打开了错误的文件)。
结论:在其他条件相同的情况下,如果使用初始化列表而不是赋值。
关于默认初始化(如Foo(): m_bar(5) { }
),我也会使用初始化器列表方法(或c++ 11成员初始化方法),只是为了与上述指南保持一致。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 在reactor中存储eventHandlers的最佳方式是什么
- 在AVX通道中混洗的最佳方式
- 从 T 创建 std::future 的最佳方式<T>
- C++:使用 std::unique_ptr 访问重载运算符++的最佳方式?
- 对列表列表中的元素进行分组的最佳方式
- 利用 GPU 的最佳方式
- 使用 QT C++过滤大数据的最佳方式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在C++中共享键值对的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 代表Quarto棋盘游戏棋子的最佳方式
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 创建控制台菜单C++的最佳方式
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?