我有一个类对象数组,在类对象内部,我还有另一个数组需要初始化为全零。代码可以编译并运行,但是我的输出显示的是C而不是0。
从头文件:
class Cache {
private:
int byte[16];
public:
Cache();
int getBytes(int);
~Cache();
};
从cpp文件
Cache::Cache()
{
byte[16]={0};
}
int Cache::getBytes(int j){
return byte[j];
}
从另一个cpp文件
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 16; j++) //visual check of initializes main memory
{
cout << cache[i].getBytes(j) << " ";
}
}
这个设置正确吗?如前所述,getBytes返回的是C而不是预期的0。
只需在构造函数初始化列表中使用值初始化即可。这是C ++中惯用的方式。
Cache::Cache() : byte()
{
}
请注意,C ++ 11也允许以下语法:
Cache::Cache() : byte{}
{
}
如果您想知道为什么这样做有效,请参阅C ++ 11标准(请注意,这也适用于C ++ 03):
C ++ 11§8.5,第10页
一个其初始值设定项是一个空括号集合(即())的对象,应进行值初始化。
价值初始化这个术语使我们能够:
C ++ 11§8.5,p7
值初始化T类型的对象的意思是:
如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型9,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式不正确);
如果T是没有用户提供的构造函数的(可能是cv限定的)非工会类类型,则该对象将初始化为零,并且,如果T的隐式声明的默认构造函数非平凡,则将调用该构造函数。
如果T是数组类型,则每个元素都进行值初始化;
否则,将对象初始化为零。
第三个选项触发每个元素的值初始化;一旦我们到达这些元素中的每一个,第四种方法就适用了,因为它们是(a)没有类类型,因此(1)和(2)不存在,(b)不是数组,因此(3)不存在。仅剩下最后一个,并且您的元素被零初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句