当前位置:  开发笔记 > 编程语言 > 正文

std :: vector初始化类成员

如何解决《std::vector初始化类成员》经验,为你挑选了1个好方法。

我已阅读,std::vector总是初始化它与它们的对象default values说了一个int0.即使classesdefault constructor调用的地方也应该适用.然而,测试程序显示的结果有点不同: -

#include 
#include 
using namespace std;

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

class B
{
    public:
        int i;
        B() = default;
};

template 
void seev (const vector &v)
{
    for (auto &x:v)
    {
        cout << x.i << ' ';
    }
    cout << '\n';
}

int main()
{
    vector vi(5);  // just to show that std::vector always default initializes values & hence int will be 0 here
    vector va(5);
    vector vb(5);

    for (auto x: vi)
    cout << x << ' ';
    cout << '\n';

    seev (va);
    seev (vb);
    return 0;
}

输出是: -

0 0 0 0 0
8854016 0 8847696 0 8854016
0 0 0 0 0

我的问题是为什么成员的价值i未定义为A¬ for Bconstructor签名有何不同之处: -

A() {}

&

B() = default;

做?



1> Dietmar Kühl..:

默认初始化值初始化之间存在差异.显示的区别B不是A:

当类具有非= defaulted构造函数时,在使用默认值或值初始化时将调用此构造函数.它的职责是适当地初始化所有成员.

当一个类没有构造函数或者一个= defaulted默认构造函数时,成员的初始化取决于对象的构造方式:在没有括号的情况下初始化对象时,默认初始化完成,这使得没有默认构造函数的子对象未初始化.当用括号值初始化对象初始化时,该值初始化所有子对象.内置类型的值初始化意味着它们获得合适的零值,而内置类型的默认初始化意味着它们未被初始化.

由于A具有显式编写的默认构造函数,因此其构造函数需要使用默认构造函数初始化非类类型的所有成员.B具有隐式编写的默认构造函数,并且根据子对象的需要执行默认值或值初始化.

a std::vector中的对象是使用构造的T()(如果没有提供其他参数,例如,用于push_back()emplace_back()).对于A那些意味着它们未被初始化的B成员,对于那些意味着它们被初始化为零的成员.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有