Доброго времени суток.
class A{
int i_;
public:
~A(){
cout << "A destr " << endl;
}
A();
A(int i) : i_(i){
cout << "My constr A " << endl;
}
};
int main(){
A* p = new A;
}
В такой реализации исходник не компилируется.
А вот в таком виде всё работает
class A{
int i_;
public:
~A(){
cout << "A destr " << endl;
}
A(){}
A(int i) : i_(i){
cout << "My constr A " << endl;
}
};
int main(){
A* p = new A;
}
Почему так?
Потому, что в первом случае конструктор у вас объявлен, но не определён, во втором - все ОК.
С C++11 так же доступна следующая запись, разрешающая компилятору генерировать конструктор по умолчанию:
A() = default;
Он компилируется, но не линкуется.
В первом случае у вас нет определения конструктора по умолчанию A::A() - только его объявление, так что нечего вызывать при создании объекта без параметров
A* p = new A;
Если изменить код на
A* p = new A(0);
или дать значение по умолчанию конструктору
A(int i = 0) : i_(i){...
выбросив A();, то все будет работать.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники