C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C 11中类数据成员的默认初始化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我对类数据成员的认初始化感到困惑.这是示例代码.
#include <iostream>
#include <vector>

class A {
public:
  int i;
  A() {}
};

A a1;
A aa1[3];
std::vector<A> av1(3);

int main()
{
  A a2;
  A aa2[3];
  std::vector<A> av2(3);
  std::cout << a1.i << " " << a2.i << std::endl;          // 0         undefined
  std::cout << aa1[0].i << " " << aa2[0].i << std::endl;  // 0         undefined
  std::cout << av1[0].i << " " << av2[0].i << std::endl;  // undefined undefined
}

在上面的代码中,只有a1.i和aa1 [0~2] .i被初始化为0,而其他的是未初始化的.我不知道为什么会这样.

具体来说,我所知道的是(来自“C Primer”):

>初始化过程是:

> a1和a2认初始化.
> aa1和aa2的每个元素都是认初始化的.
> av1和av2的每个元素都是初始值.

>认初始化的过程是:

>检查变量是内置类型还是类类型.
>对于内置类型,如果变量在任何函数体之外,则将其初始化为0,否则该值未定义.
>对于类类型,如果类具有认ctor,则调用它,否则它是编译错误.

>初始化值的过程是:

>检查变量是内置类型还是类类型.
>对于内置类型,它被初始化为0.
>对于类类型,它是认初始化的. (我认为这意味着如果类具有认ctor,否则它是编译错误.)

这样当调用ctor A :: A()时,数据成员A :: i如何初始化(我猜它是认初始化的)?为什么只有a1.i和aa1 [0~2] .i被初始化为0,而其他的是未初始化的?

解决方法

如果未提供初始化程序,则应用认初始化规则.你的构造函数没有初始化A :: i所以它没有初始化;它的价值是不确定的.毫无疑问.摘自documentation on default initialization

全局数据存储器初始化为零,即整个部分被清零,因此您看到全局A ::被初始化为0.请注意,构造函数不会这样做.摘自documentation

但是,对于向量,向量本身位于非本地静态内存中,而其元素在自由存储(堆)中分配,因此它们的成员也是未初始化的.

大佬总结

以上是大佬教程为你收集整理的C 11中类数据成员的默认初始化全部内容,希望文章能够帮你解决C 11中类数据成员的默认初始化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。