gpt4 book ai didi

c++ - 初始化困惑

转载 作者:太空狗 更新时间:2023-10-29 20:48:57 26 4
gpt4 key购买 nike

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

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();

}

检查局部变量,s1 有一个带有随机值的未初始​​化 float 。 s2 的值初始化为 0。

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

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

然而,两个实例中的字符串都被初始化了。我尝试添加其他非 POD 类而不是字符串,但后一种情况仅在我添加字符串数据成员时才会发生。我收集到添加一个字符串仍然保持它是一个 POD 类?如果它不是 POD 类,那么无论括号如何,它都应该初始化值,对吗?当我添加一个字符串数据成员时,为什么没有初始化 float (和其他原始数据类型)有什么想法吗?

最佳答案

添加字符串会阻止结构成为 POD 类,因为 POD 类必须是聚合类,没有非 POD 结构类型的成员,并且 std::string 具有(除其他外) ) 用户声明的构造函数,使其成为非 POD 结构。

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

对于第二个示例中的结构,应该发生的是 float 未由 new Stan 初始化,而是在 new Stan() 中初始化为零。

具有用户声明的默认构造函数的类型在所有情况下都通过调用该构造函数进行初始化,这是正确发生的。

参见 herehere .

关于c++ - 初始化困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2079600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com