У меня возникли проблемы с пониманием того, когда и почему именно член в моем классе инициализируется нулем в соответствии с 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 = {};
?