class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
Может ли первый конструктор вызвать второй?
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
Может ли первый конструктор вызвать второй?
Не перед С++ 11.
Извлеките общую функциональность в отдельную функцию. Обычно я называю эту функцию конструкцией().
"так называемый" второй вызов будет компилироваться, но имеет другое значение в С++: он будет создавать новый объект, временный, который затем будет немедленно удален в конце инструкции. Итак, нет.
Деструктор, однако, можно вызвать без проблем.
Не раньше 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;
}
* Черт, нет, я не пишу это в производственном коде.
Ответ на самом деле "да", но, как предложили другие, он не делает то, что вы хотите. Конечно, вы можете использовать конструктор базового класса, неявно или явно:
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 constructor which does something
A() : b() {} // call B constructor which does nothing
B b;
};
Это старый вопрос; однако,
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
может быть
class A{
A(int a = 5){
*this = A();
DoSomething();
}
A(){...}
}