Просто потому, что вы явно не вызывали конструктор, не означает, что вы его не создали. Используемая форма вызывает конструктор по умолчанию. Это может или не может правильно настроить класс, но для автора класса это вопрос, а не код, который его использует.
EDIT: Это происходит со мной, что совет, который я дал может запутать больше, чем это помогает, поэтому я приведу пару примеров:
Следующий класс имеет тривиальный конструктор по умолчанию, который не делает инициализацию своих членов:
class Point {
int x, y;
Point() { }
Point(int x, int y) : x(x), y(y) { }
};
Вы можете использовать этот класс с или без явного конструктора:
Point p;
Point r(2, 3);
В обеих формах выше экземпляр класса создается, и экземпляр готов к использованию без каких-либо сбоев или вызова неопределенного поведения. Однако в случае p
переменные-члены x
и y
не были инициализированы и, таким образом, будут иметь значения, которые, по сути, являются случайными. Как правило, вы бы заполнить такой объект, установив его переменные члены явно ...
Point a;
a.x = f();
a.y = g();
... или передавая объект в другую функцию заселить ...
void f(Point& p) { p = something(); }
⋮
Point b;
h(b);
В других случаях, конструктор по умолчанию должен инициализировать объект в нетривиальном образе:
template <typename T>
class MyArray {
public:
MyArray() : len_(0), capacity_(0), arr_(0) { }
void add(const T& t) {
if (len_ == capacity_) grow();
arr_[len_++] = t;
}
⋮
private:
size_t len_, capacity_;
T* arr_;
void grow() { … }
};
цель конструкторы заключается в преобразовании сырой памяти в работоспособный объект. В случае Point
для экземпляра не требуется никаких действий. В случае , len_
и capacity_
должны быть установлены на ноль во время построения, так что функции-члены, такие как add()
, ведут себя правильно (я также установил arr_
нулевому указателю для хорошей оценки).
Ключевое сообщение во всем этом состоит в том, что объект может быть или не быть инициализирован, но он является созданным экземпляром.
Но вы создали его! – sharjeel
Как бы то ни было, этот вопрос не имеет смысла, потому что, как сказал @sharjeel, вы создали экземпляр класса. Голосование закрывается как NARQ. (Не стесняйтесь указывать для повторного открытия, когда вы его исправили.) – sbi
Из '[instantiation]' tag-wiki: «Instantiation - это процесс создания объектов из класса во всех объектно-ориентированных и объектно-ориентированных языках». – Xeo