C ++ инициализация перечисляет несколько инициализаций

C ++

#include <stdio.h>

class a
{
public:
int var1;
a(int var)
{
var1 = var;
printf("set var1 to %d\n", var1);
}
};
class b: public a
{
public:
int var2;
b(int d) : var2(d++), a(var2++)
{
printf("d: %d, var2: %d, var1: %d\n", d, var2, var1);
}
};

int main()
{
int a = 5;
b obj1(a);
printf("%d\n", obj1.var1);
}

Выход:

set var1 to 0
d: 6, var2: 5, var1: 0
0
[Finished in 0.7s]

Почему a.var1 здесь не установлено 6?

0

Решение

Потому что C ++ игнорирует порядок, в котором вы перечисляете инициализации членов. Ctor базового класса всегда вызывается перед инициализацией других членов.*

Так что я верю, что вы вызываете неопределенное поведение Вот; вы проходите var2 как аргумент ctor, но он еще не инициализирован.


* Компилятор должен предупредить вас об этом, если вы позволите. Например, компиляция кода с помощью GCC с -Wall Флаг дает следующее сообщение:

test.cc: In constructor "b::b(int)":
test.cc:16: error: "b::var2" will be initialized after
test.cc:17: error:   base "a"test.cc:17: error:   when initialized here

4

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

Других решений пока нет …

По вопросам рекламы [email protected]