Почему так происходит? C++, инициализация данных

Имеется вот такой код

class Test {
    double* data;
public:
    Test();
    Test(int a);
};
Test::Test() {
    Test(5);
}
Test::Test(int a) {
    data = new double [a];
}

однако если в программе вызвать

Test* test = new Test();

data будет 0x0000000000000000 почему так происходит? если инициализировать при помощи второго конструктора( с параметром который) тогда всё нормально сразу, но только стоит вложенный использовать все данные куда то пропадают, при отладке их тоже видно, до момента выхода из второго конструктора


Ответы (3 шт):

Автор решения: Даниил Чижевский

Предлагаю такой вариант:

...

Test::Test() {
    data = new double [5];
}

...
→ Ссылка
Автор решения: Герман Борисов

В C++ один конструктор не может вызывать другой внутри своего тела как обычную функцию.

Можно или выносить инициализирующий код в отдельный метод

class Test {
    double* data;
    init(int a);
public:
    Test();
    Test(int a);
};
Test::Test() {
    init(5);
}
Test::Test(int a) {
    init(a);
}
Test::init(int a) {
    data = new double [a];
}

или вызывать второй конструктор в списке инициализации как в соседнем ответе

→ Ссылка
Автор решения: user7860670

Вызов конструктора, как и другие действия инициализации, должен находится в списке инициализации, а не в теле функции:

Test::Test(): Test{5} {
}
Test::Test(int a): data{new double [a]} {
    
}

Test(5); в теле функции создает безымянный временный объект, а не вызывает конструктор для этого объекта.

data = new double [5]; присваивает новое значение указателю, а не инициализирует его (хотя тут это ни на что не влияет).

→ Ссылка