代码之家  ›  专栏  ›  技术社区  ›  stan

初始化混淆

  •  3
  • stan  · 技术社区  · 16 年前

    不确定合适的标题,但它源于以下讨论:

    Do the parentheses after the type name make a difference with new?

    在Visual Studio 2008上,当我运行以下代码时:

    struct Stan
    {
        float man;
    };
    
    int main()
    {
        Stan *s1 = new Stan;
        Stan *s2 = new Stan();
    
    }
    

    但是,如果我添加一个字符串数据成员,则两个实例中的浮点值都未初始化。

    struct Stan
        {
                std::string str;
            float man;
        }; 
    

    但是,两个实例中的字符串都已初始化。我尝试添加其他非POD类而不是字符串,但只有在添加字符串数据成员时才会出现后一种情况。我推测添加一个字符串仍然可以使它保持一个POD类?若它不是POD类,那个么不管括号是什么,它都应该初始化值,对吗?当我添加一个字符串数据成员时,你知道为什么浮点数(以及其他基本数据类型)没有初始化吗?

    2 回复  |  直到 9 年前
        1
  •  5
  •   CB Bailey    16 年前

    添加字符串会阻止结构成为POD类,因为POD类必须是聚合类,且不包含非POD struct和 std::string

    这是Visual Studio 2008的已知错误/功能。它不支持C++03 对于非POD类型,如第二个示例中的结构。

    new Stan 但是零是在中初始化的吗 new Stan() .

    看见 here here .

        2
  •  0
  •   Community Mohan Dere    9 年前

    从C++98语言规范的角度来看,您观察到的行为是一致的行为。

    第一个示例中的类型是所谓的POD(普通旧数据)类型。当你申请 () POD类类型的初始值设定项它对该类的所有数据成员执行零初始化。

    str ). 当你申请 对于非POD类类型,它只调用类构造函数来执行初始化。在您的情况下,隐式[compiler provided]构造函数将正确初始化 man 会员,这就是为什么你会在里面看到垃圾。

    () 初始化器将执行 . 根据值初始化规则,在第二个示例中 男人 () 初始化器。

    https://stackoverflow.com/questions/1976185/what-is-the-difference-between-new-myclass-vs-new-myclass 如需更详细的解释。