默认初始化整数成员是否为空初始化程序?
我刚读出的那个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
};
当然,请保护你的观点,并说明为什么一个人应该优先于另一个人。
我更喜欢明确性。由于部分这个问题的错误答案已经证明,并不是所有人都明白,比如说,int()
和int(0)
是等价的
我想不提供显式值的好处是你不需要重新访问初始化列表if你前夕r改变类型。
您可能会争辩说,当类型更改为否定时(默认init不再是您想要的新类型时),不需要重新访问初始化列表。 – 2010-07-07 19:25:18
我认为他们是不同的东西,有没有可能你用void
意味着int main()
混淆NULL
相同int main(void)
但不是int main(NULL)
(在C++ NULL
相当于0
我的问题中没有函数定义。我正在问初始化类的初始化列表中的成员。 – 2010-07-07 19:14:02
当您将模板类写入默认初始化依赖类型的成员时,需要缺省的初始化。对于其他情况,如果要默认初始化成员,则没有真正的区别。但是在某些情况下,您希望获得非默认行为。当默认的初始化是不适合
一个样品:
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
VS缺省初始化我还有一个例子:在Visual Studio 2010,其被声明为与C++ 0X NULL
某种方式符合的仍然定义为0,但在C++ 0x中,您应该使用nullptr
来初始化指针。并且在C++'03中没有定义nullptr
。但你可能想让你的代码可移植。在这种情况下(为了初始化指针),我会更喜欢默认初始化值初始化。
首先,我说这可以说是更好,而不是它。 :)另外,它更多的是摆脱NULL
;我只是碰巧用什么都没有,而是0。
这可能只是一个风格问题,但重要的是要注意,as Johannes did,它不仅仅是语法风格;他们做不同的事情。让这些不同的东西一样容易。
我更喜欢数值初始化,因为我没有考虑如何初始化值的任何部分;我只是说“被初始化”。相反,一旦你引入一个值,你正在影响如何初始化值。
我觉得你会很难找到一个情况,其中价值初始化为显然更好,只需选择哪一个更适合你。
你更喜欢'B类'情况下的值初始化吗?对我来说,它感觉有点奇怪,并没有将计数变量初始化为0. – 2010-07-07 19:37:27
我认为GMan不应该回答“GMan是否正确”的问题。这是某种递归。 :) – 2010-07-07 19:40:38
@Caspin:是的。无论如何,我知道它会被初始化为0,所以我觉得指定常量只是一种浪费。 :)然后,再次明确可以更容易阅读。 – GManNickG 2010-07-07 19:42:31
有人比我更有创意能拿出更好的标题,所以我不会得到错误的答案?谁会想到你可能会得到一个最佳实践问题的错误答案。 – 2010-07-07 19:15:35
我觉得标题很清楚,而且问题写得很好。再一次,我已经知道你在问什么。错误的答案可能只是对语言的误解,而不是你的问题。 – GManNickG 2010-07-07 19:28:44