Конструктор по умолчанию не должен обнулять какой-либо элемент данных. Но в некоторых ситуациях это выглядит не так.
Пример кода краткий.
#include <iostream>
using namespace std;
class Foo {
public:
int val;
Foo() = default;
};
int main() {
Foo bar;
if (bar.val != 0) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
return 0;
}
Как указано выше, вышеприведенные выходные данные программы:
true
Однако, если добавлен оператор печати для элемента данных бара, элемент var
будет инициализирован нулем:
...
int main() {
Foo bar;
cout << bar.val << endl;
...
}
Выходные данные будут:
0
false
Аналогично, если добавитьвиртуальная функция и деструктор для класса Foo
:
#include <iostream>
using namespace std;
class Foo {
public:
virtual void Print() {}
~Foo() {}
int val;
Foo() = default;
};
int main() {
Foo bar;
if (bar.val != 0) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
return 0;
}
или просто объект init bar:
class Foo {
public:
int val;
Foo() = default;
};
int main() {
Foo bar = Foo();
...
}
выводит с:
false
Так что жепричина, которая влияет на значение члена класса? Разве все эти тесты не должны выводиться с true
?