数组不';t在c+中用大括号初始化+; 我正在学习C++,我遇到了以下奇怪的事情:
如果我像书上说的那样初始化数组数组不';t在c+中用大括号初始化+; 我正在学习C++,我遇到了以下奇怪的事情:,c++,arrays,C++,Arrays,如果我像书上说的那样初始化数组 int my_array[5] = {10} 每个数组字段仍然初始化为零,而它应该是10 如果我在循环中初始化它,它将按预期工作 发生了什么事?我正在使用Ubuntu,并使用g++编译。您观察到的是正确的:根据标准,数组的剩余项被初始化为0。当使用比数组小的列表初始化时,只有指定的元素按照您的预期被初始化;其余的初始化为0 要初始化所有值,请使用循环或,如图所示 在内部,std::fill\n相当于一个循环。从第一个链接: template <class
int my_array[5] = {10}
每个数组字段仍然初始化为零,而它应该是10
如果我在循环中初始化它,它将按预期工作
发生了什么事?我正在使用Ubuntu,并使用g++编译。您观察到的是正确的:根据标准,数组的剩余项被初始化为0。当使用比数组小的列表初始化时,只有指定的元素按照您的预期被初始化;其余的初始化为0 要初始化所有值,请使用循环或,如图所示 在内部,
std::fill\n
相当于一个循环。从第一个链接:
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
while (n>0) {
*first = val;
++first; --n;
}
return first; // since C++11
}
模板
输出计数器填充n(输出计数器第一,大小n,常数T&val)
{
而(n>0){
*第一个=val;
++第一;--n;
}
返回第一个;//从C++11开始
}
C++03(假设Ubuntu系统上有较旧版本的GCC)标准说:
8.5.1/7
如果列表中的初始值设定项少于成员数
总的来说,每个未明确初始化的成员应
值已初始化(8.5)
数组是一个集合:
8.5.1/1
聚合是没有声明用户的数组或类(第9条)
构造函数(12.1),没有私有或受保护的非静态数据成员
(第11条),没有基类(第10条),也没有虚函数
(10.3)
至于初始化值意味着什么:
初始化T类型对象的值意味着:
-如果T是具有用户声明构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)
。。。跳过所有整数不是
-否则,对象初始化为零
对于
int
类型的变量,每个字段或第一个字段之后的每个字段会发生什么情况?只有第一个元素是10,其余的0实际上,第一个元素是10(我在检查数组内容时出错)@MarkoKacanski:我可以向您保证第一个数组元素,my_array[0]
,初始化为10
@MarkoKacanski:我不买。第一个元素是10,所有其他元素都是0是的,我认为这是正确的行为。我正在使用的教程说,通过使用数组[5]={0},可以将所有内容初始化为零。我错误地认为它可以处理所有值。@MarkoKacanski该方法对于值0是最佳的,因为编译器可能会以任何顺序分配所有值0,并从本质上优化自身。在增量for循环中执行同样的操作要差得多,因为您为所有元素指定了迭代器、顺序和值。然而,这是(据我所知)初始化为非零值的唯一方法。(std::fill_n
内部工作原理相同)使用={0}
与使用={}
并让编译器隐式零初始化第一个元素是一样的。换句话说,当使用大括号时,您显式指定的任何值将仅将该字段初始化为该特定值,然后所有未指定的字段将改为零初始化。因此,如果你省略了第一个字段,编译器将为你简单地初始化它。Marko,你的书中所说的是真的,尽管如果这就是它在这个问题上所说的全部,它是误导性的。第一个元素初始化为零的原因与其余元素初始化为零的原因不同。你的书应该提到这种区别,也许是通过使用你在问题中引用的例子。我曾经和你假设的一样。这正是我想发布的支持信息。您是否有该标准的副本或查看一些在线资源?
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
while (n>0) {
*first = val;
++first; --n;
}
return first; // since C++11
}