我已经看到很多关于指针初始化的问题,但我找不到最近困扰我的事情的答案。为什么它适用于gcc:
class C {
};
/* other stuff here */
typedef C* pTypeC;
C* pOtherTypeC = pTypeC(0);
在typedef上使用“(0)”来初始化带有NULL的指针是否有效?
答案 0 :(得分:3)
问题是pTypeC(0)被认为是一个转换操作。
C* pOtherTypeC = (pTypeC) (0);
希望这有帮助!
答案 1 :(得分:0)
它正在初始化C*
到C*
,初始化为0
。这是完全合法的,但你应该更喜欢C* blah = nullptr
,尽管两者都做同样的事情。
答案 2 :(得分:0)
NULL
的值可以通过几种不同的方式定义。有时它可以简单地将值0
赋值给指针,此时存在从积分到指针类型的隐式转换,有时它是使用诸如(void*)0
之类的强制转换定义的,允许它为转换为任何其他指针类型,但如果你明确地将它指定给非指针类型失败,并且在C ++ 11中有一个特定的全局nullptr
对象,你可以使用它来初始化一个带有“NULL”的指针值。
一般情况下,如何初始化指针令人困惑,并且不是推荐的编码实践。只需向指针显式指定nullptr
或NULL
,如果选择NULL
,如果您没有包含任何其他头文件,请确保包括<cstddef>
你不会遇到编译错误。
答案 3 :(得分:0)
你正在做的不是对象的初始化,你没有分配任何新内存或创建任何新对象 - 你正在指定一个指向NULL
的指针(等于整数价值0
)。
向后工作:
C* pOtherTypeC = pTypeC(0);
C* pOtherTypeC = pTypeC(NULL);
C* pOtherTypeC = C*(NULL);
C* pOtherTypeC = (C*) NULL;
C* pOtherTypeC = NULL;
所有五行在功能上都是等效的,并且会产生相同的结果。