C++ 标准是否保证使用 {}/() 进行初始化会默认给出“0”?
Does C++ standard guarantee that,using {}/() for initialization will give "0" by default?
问题 1:
struct S
{
size_t size;
int j;
int k;
int l;
};
S s={sizeof(S)};
C++标准是不是说,上面的{}会将"j,k,l"初始化为0?
似乎可以,它是 cpp 标准的一部分吗?
问题2:
int main()
{
int* pi=new int[5];
for(int i=0;i<5;++i)
cout<<pi[i]<<',';
return 0;
}
此处指向数组 (pi) 的指针中的元素未初始化,我的 运行 结果可能类似于
6785200,6782912,0,0,0,
但是如果我把它改成
int main()
{
int* pi=new int[5]();//use ()
for(int i=0;i<5;++i)
cout<<pi[i]<<',';
return 0;
}
那么,所有的pi元素都是“0”。似乎“()”会给元素一个“0”值。这部分是cpp标准吗?
我也试过像这样使用“()”给出另一个值:
int* pi=new int[5](7);
但是编译失败。如何将初始化值赋给指向所有元素都具有相同值的数组的指针?
Question 1
是的,由 aggregate initialization 保证
特别是:
If the number of initializer clauses is less than the number of members [and bases (since C++17)] or initializer list is completely empty, the remaining members [and bases (since C++17)] are initialized [by their default initializers, if provided in the class definition, and otherwise (since C++14)] by empty lists, which performs value-initialization. If a member of a reference type is one of these remaining members, the program is ill-formed (references cannot be value-initialized).
.
Question 2
使用std::vector
:
std::vector<int> pi(5, 7);
问题1已有完美答案,我来回答问题2。
是的,你的观察是正确的。在 new
之后添加 ()
将元素的 默认初始化 变为 值初始化 。第一种形式对创建的对象不做任何事情(所以你观察到随机数),但值初始化将初始化成员 - 在这种情况下,会将元素设置为 0。不幸的是,没有办法为动态 int 数组执行特定的初始化- 您可以让它们保持未初始化状态,也可以对它们进行值初始化(到 0)。
使用 std::vector
解决了这个问题。
问题 1:
struct S
{
size_t size;
int j;
int k;
int l;
};
S s={sizeof(S)};
C++标准是不是说,上面的{}会将"j,k,l"初始化为0? 似乎可以,它是 cpp 标准的一部分吗?
问题2:
int main()
{
int* pi=new int[5];
for(int i=0;i<5;++i)
cout<<pi[i]<<',';
return 0;
}
此处指向数组 (pi) 的指针中的元素未初始化,我的 运行 结果可能类似于
6785200,6782912,0,0,0,
但是如果我把它改成
int main()
{
int* pi=new int[5]();//use ()
for(int i=0;i<5;++i)
cout<<pi[i]<<',';
return 0;
}
那么,所有的pi元素都是“0”。似乎“()”会给元素一个“0”值。这部分是cpp标准吗?
我也试过像这样使用“()”给出另一个值:
int* pi=new int[5](7);
但是编译失败。如何将初始化值赋给指向所有元素都具有相同值的数组的指针?
Question 1
是的,由 aggregate initialization 保证 特别是:
If the number of initializer clauses is less than the number of members [and bases (since C++17)] or initializer list is completely empty, the remaining members [and bases (since C++17)] are initialized [by their default initializers, if provided in the class definition, and otherwise (since C++14)] by empty lists, which performs value-initialization. If a member of a reference type is one of these remaining members, the program is ill-formed (references cannot be value-initialized).
.
Question 2
使用std::vector
:
std::vector<int> pi(5, 7);
问题1已有完美答案,我来回答问题2。
是的,你的观察是正确的。在 new
之后添加 ()
将元素的 默认初始化 变为 值初始化 。第一种形式对创建的对象不做任何事情(所以你观察到随机数),但值初始化将初始化成员 - 在这种情况下,会将元素设置为 0。不幸的是,没有办法为动态 int 数组执行特定的初始化- 您可以让它们保持未初始化状态,也可以对它们进行值初始化(到 0)。
使用 std::vector
解决了这个问题。