Вызов конструктора С++

183
25 января 2018, 19:41

Доброго времени суток.

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;
}

Почему так?

Answer 1

Потому, что в первом случае конструктор у вас объявлен, но не определён, во втором - все ОК.

С C++11 так же доступна следующая запись, разрешающая компилятору генерировать конструктор по умолчанию:

A() = default;
Answer 2

Он компилируется, но не линкуется.

В первом случае у вас нет определения конструктора по умолчанию A::A() - только его объявление, так что нечего вызывать при создании объекта без параметров

A* p = new A;

Если изменить код на

A* p = new A(0);

или дать значение по умолчанию конструктору

A(int i = 0) : i_(i){...

выбросив A();, то все будет работать.

READ ALSO
Появились ли в Стандарте С++ отражения?

Появились ли в Стандарте С++ отражения?

Есть у меня проект интерпретатора Basic, написанный на С++Проект довольно давний, ему уже лет 20

233
Не видит библиотеки при смене набора инструментов платформы C++ WinAPI

Не видит библиотеки при смене набора инструментов платформы C++ WinAPI

В общем, проблема в следующемЕсть задание написать простое приложение на чистом WinAPI

193
LNK2019 inline функция

LNK2019 inline функция

Метод assing класа List объявлен в файле listh

216