Если мы перегружаем конструктор в С++, существует ли конструктор по умолчанию?

Возможный дубликат:
Почему конструктор без параметров по умолчанию исчезает при создании конструктора с параметрами

Я написал следующую программу

#include <iostream>
class A {
public:
    A(int i) {std::cout<<"Overloaded constructor"<<std::endl;}
}

int main() {
A obj;
return 0;
}

когда я компилирую программу, я получаю следующую ошибку:

нет подходящей функции для вызова A::A() Кандидаты: A::A(int) A::A(const A&)


person user1198065    schedule 04.09.2012    source источник
comment


Ответы (4)


Существование конструктора по умолчанию в этом случае зависит от того, определили вы его или нет. Он больше не будет определен неявно, если вы сами определите другой конструктор. К счастью, вернуть его достаточно просто:

A() = default;

Обратите внимание, что термин "конструктор по умолчанию" относится к любому конструктору, который может быть вызван без каких-либо аргументов (12.1p5); не только конструкторам, которые иногда определяются неявно.

person eq-    schedule 04.09.2012
comment
Если у вас есть C++11. - person Pete Becker; 05.09.2012
comment
Да, но это довольно хороший, короткий способ сделать это. - person chris; 05.09.2012

Нет, по стандарту конструктор по умолчанию в таком случае не генерируется. Однако в С++ 11 вы можете объявить, что хотите создать конструктор по умолчанию, используя:

class A {
public:
  A() = default;
  A(int);
};
person Alex1985    schedule 04.09.2012

  • Вы можете либо написать конструктор по умолчанию, как было предложено выше, либо написать в своей основной функции:

    A* obj = new A();

  • Вы можете написать в своей основной функции, например

    A* obj = new A(5);

  • Вы можете установить в своем конструкторе

    public:
    A(int i=0) 
    { 
        cout << "My own  constructor!"; 
    }; 
    

    с помощью которого, когда вы создаете объект этого класса, вы можете либо написать

    `A* obj = new A(5);`
    

    который изменит переменную i на значение 5
    ИЛИ вы можете просто инициализировать свой объект, например

    `A* obj = new A();` 
    

    что оставит переменную i со значением по умолчанию 0.

person DKralev    schedule 04.09.2012
comment
Разве A obj = new A(5); не потребует конструктора копирования или оператора присваивания, если не объявлено A* obj? Я бы выбрал A obj(5);, если вы хотите, чтобы он был в стеке, а не в куче. - person Ghost2; 05.09.2012
comment
О, мой плохой. В последнее время я пишу на С# и немного запутался :) - person DKralev; 05.09.2012

Это соглашение С++. Когда вы написали какие-либо определяемые пользователем конструкторы, предполагается, что вам не понадобится неявный конструктор без параметров. Это понятно, так что просто запомните это.

person scotthuan    schedule 05.09.2012