Подтвердить что ты не робот

Вызов конструктора по умолчанию

class base {
    int i;
public:
    base()
    {
        i = 10;
        cout << "in the constructor" << endl;
    }
};

int main()
{
    base a;// here is the point of doubt
    getch();
}

В чем разница между base a и base a()?

в первом случае конструктор вызывается, но не во втором случае!

4b9b3361

Ответ 1

Второй объявляет функцию a(), которая возвращает базовый объект.: -)

Ответ 2

base a объявляет переменную a типа base и вызывает свой конструктор по умолчанию (предполагая, что это не встроенный тип).

base a(); объявляет функцию a, которая не принимает никаких параметров и возвращает тип base.

Причина этого заключается в том, что язык в основном указывает, что в случаях двусмысленности подобным образом следует разбирать все, что может быть проанализировано как объявление функции. Вы можете найти "С++ most vexing parse" для еще более сложной ситуации.

Из-за этого я предпочитаю new X; более new X();, потому что он согласуется с не-новым объявлением.

Ответ 3

В С++ вы можете создать объект двумя способами:

  • Автоматический (статический)
  • Динамический

Первый использует следующее объявление:

base a; //Uses the default constructor
base b(xxx); //Uses a object defined constructor

Объект удаляется, как только он выходит из текущей области.

В динамической версии используется указатель, и вы можете его удалить:

base a = new base(); //Creates pointer with default constructor
base b = new base(xxx); //Creates pointer with object defined constructor

delete a; delete b;