class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
Может первый вызов конструктора второй?
Не до C ++ 11 .
Вместо этого выделите общие функции в отдельную функцию. Я обычно называю эту функцию construct () .
«Так называемый» второй вызов будет компилироваться, но в C ++ имеет другое значение: он создает новый объект, временный, который затем будет сразу удаляться в конце выписки. Итак, нет.
Деструктор, однако, можно вызвать без проблем.
Не раньше C ++ 0x
, №
НО, просто из академического интереса Я придумал ужасный способ * сделать это с помощью оператора размещения "new" (кто-нибудь может указать, насколько это переносимо?)
#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;
}
* Черт, нет, я не пишу это в производственном коде.
Фактически ответ - «да», но, как предполагали другие, он не делает того, что вы хотите. Вы, конечно, можете использовать конструктор базового класса неявно или явно:
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
};
Не напрямую. Есть несколько способов обойти это.
Из списка инициализаторов конструктора вашего класса вы можете вызвать конструктор для любого базового класса и для всех переменных-членов.
Таким образом, вы можете провести рефакторинг своего класса и разбить его на несколько более мелких, чтобы решить проблему. Обычно выполняемый код может быть помещен в объект-член или, возможно, в базовый класс. Затем каждый из конструкторов основного класса просто должен решить, какой конструктор использовать для инициализации этого члена.
class B {
B() { }
B(int b) { DoSomething(); }
}
class A{
A(int a = 5) : b(a) { } // call B's constructor which does something
A() : b() {} // call B's constructor which does nothing
B b;
};