У меня возникли проблемы с пониманием того, когда и почему именно член в моем классе инициализируется нулем в соответствии с http://en.cppreference.com/w/cpp/language/zero_initialization.
Рассмотрим следующую тестовую программу:
#include <iostream>
#include <stdio.h>
class MyTest {
private:
const static unsigned int dimension = 8;
void (* myFunctions [dimension])();
public:
MyTest() {}
void print() {
for(unsigned int i=0; i < MyTest::dimension; i++) {
printf("myFunctions[%d] = %p\n", i, this->myFunctions[i]);
}
}
};
int main() {
//We declare and initialize an object on the stack
MyTest testObj = {};
testObj.print();
return 0;
}
Я объявляю класс иметь массив из 8 указателей на функции подписи "void functionname()". Когда я объявляю и инициализирую объект класса main как MyTest testObj = {}; или MyTest testObj; , Я ожидал, что это будет нулевой инициализацией, т.е. Все указатели являются нулевыми указателями.
Однако компиляция с g++ 5.3.0 на моем компьютере с Windows 10 с g++ -m32 -o test -std=c++14 test.cpp && test machine дает результат:
myFunctions[0] = 76dd6b7d
myFunctions[1] = 00401950
myFunctions[2] = 0061ff94
myFunctions[3] = 004019ab
myFunctions[4] = 00401950
myFunctions[5] = 00000000
myFunctions[6] = 003cf000
myFunctions[7] = 00400080
Которые выглядят как неинициализированные значения из стека.
Если я перемещаю объявление объекта вне основного (как глобальную переменную), он снова печатает все нули.
Если я правильно понял cppreference, это связано с тем, что у меня есть переменная с продолжительностью статического хранения и, следовательно, нулевая инициализация. Он инициализирует мой тип класса нулевой инициализацией всех нестатических элементов данных моего класса (т. myFunctions). Массив инициализируется нулевой инициализацией каждого его элемента, который в моем случае с указателем функции является нулевым указателем.
Почему это не ноль - инициализирует мой объект стек, когда я объявляю его с помощью MyTest testObj = {}; ?