gpt4 book ai didi

c++ - std::vector 初始化类成员

转载 作者:太空狗 更新时间:2023-10-29 19:45:36 27 4
gpt4 key购买 nike

我读过 std::vector 总是用它们的 默认值 初始化它的对象,比如 int 它是 0 。这同样适用于调用 默认构造函数classes。然而,测试程序显示的结果有点不同:-

#include <iostream>
#include <vector>
using namespace std;

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

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

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

int main()
{
vector<int> vi(5); // just to show that std::vector always default initializes values & hence int will be 0 here
vector<A> va(5);
vector<B> 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

我的问题是,为什么 A 的成员 i 的值未定义,而 B 的值未定义? constructor 签名有什么区别:-

A() {}

&

B() = default;

制作?

最佳答案

默认初始化值初始化是有区别的。差异显示为 B但不适用于 A :

  • 当一个类有一个非= default ed 构造函数,当使用默认或值初始化时调用此构造函数。它的职责是适本地初始化所有成员。

  • 当一个类没有构造函数或一个= default ed 默认构造函数成员的初始化取决于对象的构造方式:当初始化对象时没有括号默认初始化完成,这使得没有默认构造函数的子对象未初始化。当用括号初始化对象时,值初始化完成,该值初始化所有子对象。内置类型的值初始化意味着它们获得合适的零值,而内置类型的默认初始化意味着它们保持未初始化状态。

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

std::vector<T> 中的对象使用 T() 构建(如果没有按原样提供其他参数,例如 push_back()emplace_back() )。对于 A对于 B,这意味着它们未初始化的成员成员,这意味着它们是零初始化的。

关于c++ - std::vector 初始化类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com