hash_table - массив указателей типа hash_table_entry, верно?
Нет, hash_table
- это указатель на hash_table_entry
, который после данной инициализациис new hash_table_entry[hash_table_size];
будет указывать на (первый элемент) массив из hash_table_entry
(а не массив для указателя на hash_table_entry
).
Когда цикл for проходит через массив и создает новую структуру hash_table_entry, для переменных структуры по умолчанию автоматически устанавливается значение "Nil"?
Как отмечено в комментариях, присваивание
hash_table[i] = new hash_table_entry;
не компилируется из-за несоответствия типов. hash_table[i]
имеет тип hash_table_entry
, в то время как new hash_table_entry
имеет тип hash_table_entry*
.
Но, за исключением вопроса инициализации: new hash_table_entry
и new hash_table_entry[hash_table_size]
(оба создают объекты или массивы объектовтипа hash_table_entry
) создание объектов. Поскольку в этих выражениях не указан инициализатор, объекты создаются по умолчанию. Поскольку hash_table_entry
не имеет никаких объявленных / определенных конструкторов, это означает, что будет использоваться неявно определенный конструктор по умолчанию. Этот конструктор выполняет конструкцию по умолчанию для всех членов hash_table_entry
, что (поскольку они не являются типами классов) означает, что с ними ничего не сделано, и поэтому значения членов останутся неопределенными после инициализации.
Является ли это значением присвоения Nil
, сомнительно. Nil
- это не то, что существует в C ++, и поэтому я предполагаю, что подразумевается NULL
или nullptr
и что вы должны выделить массив указателей вместо объектов и инициализировать их нулевыми указателями.
Массив указателей на hash_table_entry
выделяется с new hash_table_entry*[hash_table_size]
, что приводит к hash_table_entry**
, а не hash_table_entry*
. Если вы добавите {}
как в:
new hash_table_entry*[hash_table_size]{}
или более явно
new hash_table_entry*[hash_table_size]{nullptr}
, это также инициализирует все указатели для нулевых указателей для вас, цикл не требуется.