Eva*_*ard 35 c++ constructor initialization
关于以下内容,是否有任何理由做一个或另一个或大致等同?
class Something
{
int m_a = 0;
};
Run Code Online (Sandbox Code Playgroud)
VS
class Something
{
int m_a;
Something(int p_a);
};
Something::Something(int p_a):m_a(p_a){ ... };
Run Code Online (Sandbox Code Playgroud)
Chr*_*ckl 45
您发布的两个代码段并不完全相同.
class Something
{
int m_a = 0;
};
Run Code Online (Sandbox Code Playgroud)
在这里指定初始化的值,即0在编译时.
class Something
{
int m_a;
Something(int p_a);
};
Something::Something(int p_a):m_a(p_a){ ... };
Run Code Online (Sandbox Code Playgroud)
在这里,您可以在运行时(或可能在运行时)执行此操作,在p_a调用构造函数之前,该值不可知.
以下代码更接近您的第一个示例:
class Something
{
int m_a;
Something();
};
Something::Something() : m_a(0) { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
这里你需要考虑的是,在第一种情况下,值直接出现在类定义中.这可能会产生不必要的依赖.如果您需要稍后将其更改0为1会发生什么?将值直接暴露在类定义中(因此通常在头文件中)可能会导致在其他形式的初始化将避免它的情况下重新编译大量代码,因为该Something::Something() : m_a(0)部分将被巧妙地封装在源文件中并且不会出现在头文件中:
// Something.h - stable header file, never changed
class Something
{
int m_a;
Something();
};
// Something.cpp - can change easily
Something::Something() : m_a(0) { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
当然,类内初始化的好处可能远远超过这个缺点.这取决于.你只需记住它.
Mik*_*our 12
如果您有多个构造函数(并希望它们以相同的方式初始化成员),或者如果您不需要编写构造函数,则第一个窗体更方便.
如果初始化程序依赖于构造函数参数,则第二个是必需的,否则对于类内初始化而言太复杂; 如果构造函数很复杂,可能会更好,以便将所有初始化保存在一个地方.(如果你必须支持前C++ 11编译器,它也是必需的.)
第一种形式是C++ 11的新版本,因此在这一点上得不到很好的支持,特别是如果你需要支持各种较旧的编译器.
否则,当C++ 11编译器可用时,它们应大致相同.
详细说明 Christian Hackl 的回答。
第一种形式允许初始化m_a并同时具有默认的 c'tor。或者你甚至可以在你的代码中显式地定义一个带有default关键字的构造函数:
class Something
{
int m_a = 0;
// explicitly tell the compiler to generate a default c'tor
Something() = default;
};
Run Code Online (Sandbox Code Playgroud)
使用第二种形式,自动生成的默认 c'tor 将保持m_a未初始化状态,因此如果您想初始化为硬编码值,您必须编写自己的默认 c'tor:
class Something
{
int m_a;
// implement your own default c'tor
Something() : m_a(0) {}
};
Run Code Online (Sandbox Code Playgroud)