инициализация переменных-членов класса в базовых и производных классах - PullRequest
3 голосов
/ 11 апреля 2019

Допустим, у нас есть класс Base и класс Derived:

class Base {

  public:

    Base(int x) : var1(x)

    int process(){
       //return some function of var1
    }

  protected:
    int var1;

}

class Derived : public Base {

  Derived(int init) : Base(init), a(process()), b(process()) {}

  protected:

    int a;
    int b;


}

Другими словами, когда мы инициализируем Derived, мы предполагаем, что конструктор Base вызывается первым, которая инициализирует переменную-член var1 в базовом классе значением init, а затем переменные-члены a и b инициализируются с помощью функции process(), которая зависит от значения, установленного на var1.

Обратите внимание, что для правильности этого кода нам необходимо убедиться, что Base(init) вызывается до a(process()) и b(process()).

Допустимо ли в C ++ предполагать, чтовышеуказанный порядок инициализации будет сохранен?Или мне нужно изменить конструктор Derived на следующий, чтобы гарантировать порядок инициализации?

Derived(int init) : Base(init) {

  a = process();
  b = process();
}

1 Ответ

4 голосов
/ 11 апреля 2019

Заказ гарантирован, вам ничего не нужно делать. Основания инициализируются перед членами (в том порядке, в котором они были объявлены). Члены инициализируются в порядке, в котором они были объявлены [class.base.init] / 13 (примечание: порядок объявления, не порядок, в котором mem- инициализаторы появляются в списке инициализатора конструктора!).

Вы также можете рассчитывать на уничтожение баз и членов в совершенно противоположном порядке, в котором они были инициализированы & hellip;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...