Правильный способ написания конструкторов в Stack Overflow

РЕДАКТИРОВАТЬ: изменил мой вопрос на что-то более значимое

Если у меня есть класс:

class A{
public:
int nr;
int *a;

A();
};

A::A(): nr(0), a = new int[10]{}

Это суета, но если у меня есть

 A::A(): nr(0) {a = new int[10];}

Оно работает. Пожалуйста, объясните мне это поведение.

-1

Решение

nr(0) инициализатор для элемента данных nr,

{a = new T[10]; } это тело конструктора, которое присваивает значение элементу данных a после инициализация в списке инициализаторов выполнена.

{} является пустым телом конструктора, это означает, что конструктор ничего не делает (кроме как инициализировать nrконечно, так как это в списке инициализатора).

a = new int[10] Между списком инициализатора и телом конструктора нет смысла, синтаксис языка не позволяет этого. Он не должен компилироваться, но если вы нашли компилятор, который его принимает, а затем он падает, вам придется обратиться к документации этого компилятора для объяснения.

1

Другие решения

Это должно выглядеть примерно так:

template<class T>
class A {
public:
int nr;
T *a;
A();
};

template<class T>
A<T>::A() : nr(0), a( new T[42]) { }
1

Ни один не должен компилироваться. Правильный путь был бы такой:

  • первый случай: A::A(): nr( 0 ), a( new int[5] ){}
  • второй случай: A<T>::A(): nr( 0 ), a( new T[10] ){}
0
По вопросам рекламы [email protected]