【问题标题】:Pointer initialization指针初始化
【发布时间】:2012-02-10 18:55:41
【问题描述】:

我已经看到很多关于指针初始化的问题,但我找不到最近困扰我的问题的答案。为什么它适用于 gcc:

class C {
};

/* other stuff here */

typedef C* pTypeC;
C* pOtherTypeC = pTypeC(0);

在typedef上使用“(0)”来初始化指针为NULL是否有效?

【问题讨论】:

  • 我不确定(因此这是评论而不是答案),但我认为它被解释为:C* pOtherTypeC = (pTypeC)(0); 等于 C* pOtherTypeC = (C*)(0); 留给你一个演员表。跨度>
  • 在 C++11 中你可以/应该使用 nullptr 而不是 NULL 反正
  • @awoodland:为什么要这样做?不必要。如果您不关心那些额外的类型安全检查,您不妨只使用 0...
  • 很遗憾,我的应用只能使用 C++03 标准。
  • @VladLazarenko 为什么不关心类型安全? >:|

标签: c++ pointers initialization


【解决方案1】:

问题在于 pTypeC(0) 被认为是一个强制转换操作。

C* pOtherTypeC = (pTypeC) (0);

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    它将C* 初始化为C*,而C* 已初始化为0。这是完全合法的,但您应该更喜欢C* blah = nullptr,尽管两者都做同样的事情。

    【讨论】:

      【解决方案3】:

      NULL 的值可以用几种不同的方式定义。有时它可以简单地将值 0 分配给一个指针,此时存在从整数到指针类型的隐式转换,其他时候它是使用诸如 (void*)0 之类的强制转换定义的,允许将其转换为任何其他类型指针类型,但如果您将其显式分配给非指针类型,则失败,并且在 C++11 中有一个特定的全局 nullptr 对象,您可以使用它来初始化具有“NULL”值的指针。

      不过,一般而言,您如何初始化指针是令人困惑的,并且不是推荐的编码做法。只需将nullptrNULL 显式分配给指针,如果您选择NULL,那么如果您没有包含任何其他头文件,请确保包含<cstddef>,这样您就不会遇到编译器错误。

      【讨论】:

        【解决方案4】:

        您所做的不是初始化对象,您还没有分配任何新内存或创建任何新对象——您正在分配一个指向 NULL 的指针(它等于整数值 @ 987654322@).

        向后工作:

        C* pOtherTypeC = pTypeC(0);
        C* pOtherTypeC = pTypeC(NULL);
        C* pOtherTypeC = C*(NULL);
        C* pOtherTypeC = (C*) NULL;
        C* pOtherTypeC = NULL;
        

        所有五行在功能上都是等效的,并且会产生相同的结果。

        【讨论】:

        • 已修复以明确初始化是指(C *)类对象...虽然我的回复被击败了1m左右。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 2011-04-10
        • 2012-11-10
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多