Joker_vDПо Вашему коду:
Во-первых, конструктор по-умолчанию у
DataClass все-таки есть. Он автоматически слеплен компилятором и вызывает конструкторы по умолчанию полей. Вот чтобы он еще и создавал корректный (с т.з. логики работы программы) объект, который потом будет нормально использоваться в программе, может потребоваться его явная реализация.
Во-вторых, объекты каких-либо классов лучше передавать не по значению, а по ссылке. Если они при этом не изменяются в методе, то следует пользоваться ссылкой на константу. Т.е. вместо
Код:
DataClass(vec_ZZ_pE data);
лучше писать
Код:
DataClass(const vec_ZZ_pE& data);
В этом случае не будет создаваться промежуточный объект класса
vec_ZZ_pE, а потому и не будет тратиться время на вызов конструктора копирования и деструктора для этого объекта.
В-третьих, все "ненадежные" операции (вроде операций с файлами) лучше выносить за пределы конструкторов, поскольку в этом случае гораздо проще обрабатывать различные исключительные ситуации. Т.е. в конструкторе реализовывать логику по созданию пустого, но рабочего объекта, а загрузку из файла производить в отдельном методе (а не иметь дело с наполовину созданным объектом, если файл не был найден, или у него оказался неверный формат, или в нем оказались некорректные данные).
В-четвертых, вместо конструкции вида
Код:
data = DataClass(t);
можно было просто реализовать и вызвать метод, загружающий данные из
vec_ZZ_pE в
DataClass (при условии корректно реализованного конструктора по умолчанию у
DataClass). Это позволит избежать создания промежуточного объекта типа
DataClass и вызова логики оператора присваивания, а также связанных с этим потерь времени.
Любые конструкторы класса vec_ZZ_pE должны вызываться лишь ПОСЛЕ вызова InitZZ
Честно говоря, это как-то странно и попахивает какими-то статическими объектами...
Объект DataClass по смыслу своему не может быть пустышкой — он внутри состоит не из полей типа ZZ_pE*, а из полей ZZ_pE
Замечательно. Что мешает завести также и конструктор по умолчанию для
ZZ_pE?