Подтвердить что ты не робот

Может ли конструктор вызвать другой конструктор в С++?

class A{
  A(int a = 5){
    DoSomething();
    A();
  }
  A(){...}
}

Может ли первый конструктор вызвать второй?

4b9b3361

Ответ 1

Не перед С++ 11.

Извлеките общую функциональность в отдельную функцию. Обычно я называю эту функцию конструкцией().

"так называемый" второй вызов будет компилироваться, но имеет другое значение в С++: он будет создавать новый объект, временный, который затем будет немедленно удален в конце инструкции. Итак, нет.

Деструктор, однако, можно вызвать без проблем.

Ответ 2

Не раньше C++0x, no.

НО, только из академического интереса я придумал действительно ужасный способ * сделать это, используя оператор размещения "новый" (кто-то хочет указать, насколько он переносится?)

#include <new>
#include <iostream>

class A
{
public:
    A(int i, int j)
        : i_(i), j_(j) { }

    A(int i)
    { new (this) A(i, 13); }

    int i_,j_;
};

int
main() {
    A a1(10,11), a2(10);
    std::cout
        << a1.i_ << ", "
        << a1.j_ << std::endl
        << a2.i_ << ", "
        << a2.j_ << std::endl;
    return 0;
}

* Черт, нет, я не пишу это в производственном коде.

Ответ 3

Ответ на самом деле "да", но, как предложили другие, он не делает то, что вы хотите. Конечно, вы можете использовать конструктор базового класса, неявно или явно:

struct B {
    B() {}
    B( int x ) {}
};

struct A : public B {
    A() {}    // calls B() implicitly
    A( int a, int b ) : B( b ) {} // calls B(int) explicitly
};

Ответ 4

Не напрямую. Есть несколько способов обойти это.

Из списка инициализаторов конструктора вашего класса вы можете вызвать конструктор для любого базового класса и всех переменных-членов.

Таким образом, вы можете реорганизовать свой класс и разделить его на несколько меньших, чтобы решить проблему. Обычно исполняемый код может быть помещен в объект-член или, возможно, в базовый класс. Затем каждый из конструкторов основного класса должен решить, какой конструктор использовать для инициализации этого элемента.

class B {
  B() {  }
  B(int b) { DoSomething(); }
}
class A{
  A(int a = 5) : b(a) { } // call B constructor which does something
  A() : b() {} // call B constructor which does nothing

  B b;
};

Ответ 5

Это старый вопрос; однако,

class A{
  A(int a = 5){
    DoSomething();
    A();
  }
  A(){...}
}

может быть

class A{
  A(int a = 5){
    *this = A();
    DoSomething();
  }
  A(){...}
}