默认初始化整型成员是否首选空初始值设定项?
我刚刚读了 GMan 的评论,
class A
{
public:
A() :
m_ptr() // m_ptr is implicitly initialized to NULL
{ }
};
应该优先于
class A
{
public:
A() :
m_ptr(NULL) // m_ptr is explicitly initialized to NULL
{ }
};
注意第一个示例中缺少 NULL
。
G曼说得对吗?这可能有点主观,因此“您是否更喜欢默认初始化的空初始化器?”可能更合适。
另外,如果您更喜欢空初始值设定项,这是否适用于其他整数成员?
class B
{
public:
B() :
m_count(),
m_elapsed_secs()
{}
private:
std::size_t m_count;
float m_elapsed_secs; //the elapsed time since instantiation
};
当然,请捍卫您的观点,并说明为什么其中一种应该优于另一种。
I just read a comment by GMan that
class A
{
public:
A() :
m_ptr() // m_ptr is implicitly initialized to NULL
{ }
};
should be preferred over
class A
{
public:
A() :
m_ptr(NULL) // m_ptr is explicitly initialized to NULL
{ }
};
Notice the lack of NULL
in the first example.
Is GMan right? This might kinda subjective, so "Do you prefer empty initializers for default initialization?" might be more appropriate.
Also if you prefer empty initializers, do does this apply to other integral members?
class B
{
public:
B() :
m_count(),
m_elapsed_secs()
{}
private:
std::size_t m_count;
float m_elapsed_secs; //the elapsed time since instantiation
};
Of course, please defend your view point with a description of why one should be preferred over the other.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我更喜欢明确的。正如这个问题的一些错误答案所表明的那样,并不是每个人都清楚地知道
int()
和int(0)
是等价的。我认为不提供显式值的优点是,如果您更改类型,则无需重新访问初始化列表。
I prefer the explicitness. As some of the wrong answers to this question have demonstrated, it's not obvious to everyone that, say,
int()
andint(0)
are equivalent.I suppose not supplying an explicit value has the advantage that you won't need to revisit the initialization list if you ever change the type.
首先,我说它可以说更好,但事实并非如此。 :) 另外,更多的是要摆脱
NULL
;我只是碰巧什么也没用,而不是 0。但无论如何,这是一个有趣的问题。这可能只是风格问题,但值得注意的是, 正如约翰内斯所做的,这不仅仅是句法风格;而是。他们做不同的事情。将这些不同的东西变得相同很容易。
我更喜欢值初始化,因为我不参与值初始化的任何部分;我只是说“被初始化”。相反,一旦引入一个值,您就会影响该值的初始化方式。
我认为您很难找到一种价值初始化明显更好的情况,只需选择哪一个更适合您即可。
Firstly, I said it's arguably better, not that it is. :) Also, it was more about getting rid of
NULL
; I just happen to use nothing instead of 0. But an interesting question anyway.It's probably just a matter of style, but it's important to note, as Johannes did, that it's not just syntactical style; they do different things. It's just easy to make those different things the same.
I prefer value-initialization, because I'm not taking any part of how the value is being initialized; I'm simply saying "be initialized." Contrarily, once you introduce a value you are influencing how the value is initialized.
I think you'd be hard-pressed to find a situation where value-initialization is clearly better, just pick which one suits you more.
当您编写模板类来默认初始化依赖类型的成员时,默认初始化是必需的。对于其他情况,如果您想默认初始化成员,则没有真正的区别。但在某些情况下,您想要获得非默认行为。
默认初始化不合适时的一个示例:
至于使用
NULL
与默认初始化,我还有一个例子:在 Visual Studio 2010 中,它被声明为在某种程度上与 C++0xNULL< 一致/code> 仍然定义为 0,但在 C++0x 中,您应该使用
nullptr
来初始化指针。 C++'03 中未定义nullptr
。但您可能想让您的代码可移植。在这种情况下(初始化指针)我会更喜欢默认初始化而不是值初始化。Default initialization is necessary when you write a template class to default initialize members of dependent types. For other cases there're no real difference if you want to default initialize the member. But there are some cases when you want to get non default behavior.
One sample when default initialization is not suitable:
As for using
NULL
vs default initialization I have one more example: in Visual Studio 2010 which is declared to be somehow conformant with C++0xNULL
is still defined as 0, but in C++0x you should usenullptr
to initialize pointers. Andnullptr
is not defined in C++'03. But you probably want to make your code portable. In that case (to initialize pointers) I will prefer a default initialization over value initialization.我认为它们是不同的东西,您是否可能将
NULL
与void
混淆,这意味着int main()
与int 相同main(void)
但不是int main(NULL)
(在 C++ 中NULL
相当于 0I think they are different things, is it possible you are confusing
NULL
withvoid
meaningint main()
is the same asint main(void)
but NOTint main(NULL)
(In C++NULL
is equivalent to 0