Нет, один конструктор не может напрямую вызвать другой конструктор для инициализации одного и того же объекта в C++. Это частое заблуждение среди разработчиков.
Когда ты пытаешься вызвать другой конструктор внутри тела конструктора, это не инициализирует текущий объект. Вместо этого создаётся временный объект:
class Foo {
public:
Foo(char x);
Foo(char x, int y);
};
Foo::Foo(char x) {
Foo(x, 0); // Создает ВРЕМЕННЫЙ объект, не this!
} // Временный объект уничтожается здесь
Временный объект сразу же уничтожается после завершения оператора, что никак не помогает инициализировать текущий объект.
Объедини конструкторы, используя значения параметров по умолчанию:
class Foo {
public:
Foo(char x, int y = 0); // Обрабатывает оба случая
};
Вынеси общую логику инициализации в приватный метод:
class Foo {
public:
Foo(char x);
Foo(char x, int y);
private:
void init(char x, int y);
};
Foo::Foo(char x) {
init(x, static_cast<int>(x) + 7);
}
Foo::Foo(char x, int y) {
init(x, y);
}
НЕ используй placement new для попытки создания цепочки конструкторов:
Foo::Foo(char x) {
new(this) Foo(x, 0); // ПЛОХО! Не делай так!
}
Это повреждает частично инициализированные члены и нарушает семантику инициализации объекта.
В C++ вызов другого конструктора внутри тела конструктора инициализирует текущий объект значениями из вызванного конструктора.
Новый — ещё не проверен сообществом
Вы