我刚刚阅读了comment by 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
。
GMan对吗?这可能有点主观,所以“你更喜欢空初始化器进行默认初始化吗?”可能更合适。
此外,如果您更喜欢空的初始化程序,这是否适用于其他整数成员?
class B
{
public:
B() :
m_count(),
m_elapsed_secs()
{}
private:
std::size_t m_count;
float m_elapsed_secs; //the elapsed time since instantiation
};
当然,请捍卫您的观点,并说明为什么应优先考虑另一方。
答案 0 :(得分:7)
我更喜欢显性。正如这个问题的一些错误答案已经证明的那样,对于每个人来说,int()
和int(0)
是等价的并不明显。
我认为不提供显式值的优点是,如果您更改了类型,则无需重新访问初始化列表。
答案 1 :(得分:2)
当您将模板类编写为默认初始化依赖类型的成员时,必须进行默认初始化。对于其他情况,如果要默认初始化成员,则没有真正的区别。但是在某些情况下,您希望获得非默认行为。
默认初始化不合适时的一个示例:
struct X {
HANDLE some_file_handle;
// note that INVALID_HANDLE_VALUE is not equal to 0 in Windows
X() : some_file_handle( INVALID_HANDLE_VALUE ) {}
};
至于使用NULL
和默认初始化我还有一个例子:在Visual Studio 2010中声明与C ++一致,NULL
仍然被定义为0,但在C中++ 0x您应该使用nullptr
来初始化指针。并且nullptr
未在C ++'03中定义。但是你可能想让你的代码可移植。在这种情况下(为了初始化指针),我更喜欢默认初始化而不是值初始化。
答案 2 :(得分:2)
首先,我说它可以说更好,而不是它。 :)此外,它更多的是摆脱NULL
;我碰巧没有使用任何东西而不是0.但无论如何都是一个有趣的问题。
这可能只是风格问题,但重要的是要注意as Johannes did,这不仅仅是语法风格;他们做不同的事情。把这些不同的东西变得一样容易。
我更喜欢值初始化,因为我没有参与如何初始化值的任何部分;我只是说“被初始化”。相反,一旦引入了一个值,就会影响值的初始化。
我认为你很难找到价值初始化明确更好的情况,只需挑选哪一种更适合你。
答案 3 :(得分:-1)
我认为它们是不同的东西,是否有可能让NULL
混淆void
意味着int main()
与int main(void)
相同但不是int main(NULL)
(在C ++中,NULL
相当于0