类中的 std::list 变量是否需要初始化?

时间:2021-04-29 09:09:27

标签: c++ initialization

我最近读到了这样的东西。我知道它没有那么复杂。但作为初学者,我只是不知道它为什么有效,所以这里是描述。

#include <list>
#include <iostream>

using namespace std;
 
template <typename T>
class A
{
public:
    list<T *> testlist;
    A();
    ~A();
    void m_append(T* one);
};

template <typename T>
A<T>::A()
{
    cout << "constructor" << endl;
}

template <typename T>
A<T>::~A()
{
    cout << "destructor" << endl;
}

template <typename T>
void A<T>::m_append(T* one)
{
    cout << *one << " push in" << endl;
    testlist.push_back(one);
}

int main(void)
{
    A<int> a;
    int b = 4;
    int c = 5;
    int d = 6;
    a.m_append(&b);
    a.m_append(&c);
    a.m_append(&d);

    return 0;
}

我认为这个testlist没有初始化,应该是有问题。

但它有效。

constructor
4 push in
4
5 push in
5
6 push in
6
destructor

所以我很困惑。不需要初始化这个testlist或者?

2 个答案:

答案 0 :(得分:1)

数据成员testlistA的构造函数的成员初始值设定项列表中未提及,并且没有默认成员初始值设定项(C++11起),则为{{3 }} 通过 std::list 的默认构造函数。

<块引用>
  1. 当构造函数初始值设定项列表中未提及基类或非静态数据成员并且调用该构造函数时。

<块引用>

不需要初始化这个testlist还是?

这取决于您的意图。如果默认初始化就足够了,那么是的。

答案 1 :(得分:-2)

要理解这一点,您必须知道列表是如何构造的。 它在堆栈上有一个控制块,然后在插入元素时在堆上分配元素。控制块由构造函数初始化。

这是一张图片来了解它的样子:

enter image description here

所以你不需要初始化列表。

相关问题