Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, makdak, Вы писали:
M>>можно ли так делать в членах класса?
J>А зачем?
Чтобы обнулить всё в нём. Смотрю исходники, везде юзают:
memset(pointer_to_obj_T, 0, sizeof(T));
вот и думаю почему ни кто не делает это в члене класса, тем более если такая операция многократно используется, над одним и тем же объектом..
думаю, дай поинтересуюсь, может что новое узнаю
smeeld:
NI>>Это чьи-то сишные привычки. В C++ подобное делается через инициализацию с пустым списком параметров:
S>Это не прокатит если требуется обнулить поля объекта в какой-то момент после инициализации.
smeeld:
S>Ни в чём, просто почему бы не распространить такой способ обнуления и на не POD структуры, удобно же.
Инициализация с () или {} одинаково хорошо работает и с POD, и с non-POD. Присваивание временного объекта тоже. А memset-ом можно ненароком занулить то, что нулём быть не должно.
NI>Инициализация с () или {} одинаково хорошо работает и с POD, и с non-POD. Присваивание временного объекта тоже. А memset-ом можно ненароком занулить то, что нулём быть не должно.
Если у меня struct A{...}, то она без проблем автоматически обнуляется через присвоение {} её ссылке, если у нас class B{...} с виртуальной таблицей и прочими причиндалами, то нифига присвоение {} ссылке не обнуляет поля, для этого нужно писать уже operator= с initializer_list-ом в котором приравнивать нулю поля.
smeeld:
S>Если у меня struct A{...}, то она без проблем автоматически обнуляется через присвоение {} её ссылке, если у нас class B{...} с виртуальной таблицей и прочими причиндалами, то нифига присвоение {} ссылке не обнуляет поля, для этого нужно писать уже operator= с initializer_list-ом в котором приравнивать нулю поля.
А что такое нулевое значение для класса "с виртуальной таблицей и прочими причиндалами"? То-то ж и оно, что в подобной реализации сброса поля обычно заполняются некими дефолтными значениями, которые могут быть либо нулями, либо чем-то ещё. И, покуда класс T предоставляет возможность получить дефолтное значение T() и присвоить его другому объекту t = T(), то же самое можно делать с его агрегатами:
struct S
{
T t;
int i;
};
S s;
....
s = S();
Такой код корректно отработает независимо от того, какой последовательностью побайтовых значений может быть представлено дефолтное значение s.t.