Различные способы построения объекта в C++

Я хочу построить объект в стеке, используя С++. Знаете ли вы, в чем разница между этими способами вызова конструктора (с круглыми скобками и без них):

a) MyClass object ;

b) MyClass object() ;

Я использую MFC, и при создании глобальной переменной для основного приложения, если я использую последний способ, я получаю исключение, я думал, что эти два способа эквивалентны.

Спасибо, ребята, за любую информацию.


person lurks    schedule 22.02.2010    source источник
comment
как выглядит конструктор для MyClass?   -  person Eli Bendersky    schedule 22.02.2010
comment
Я бы не подумал, что вы получите исключение с (b). Это должно привести к ошибке компиляции.   -  person LeopardSkinPillBoxHat    schedule 22.02.2010


Ответы (2)


Это одна из тех ошибок C++.

MyClass object();

это способ определения функции prototype в C++, поэтому компилятор думает, что вы пытаетесь объявить другую функцию в середине другой функции.

Если вы хотите вызвать конструктор по умолчанию (то есть тот, который не принимает аргументов), используйте этот синтаксис:

MyClass object;

См. Также ответ Гарта Гилмора на теперь удаленный вопрос Какой ваш (наименее) любимый синтаксис?:

In C++

Employee e1("Dave","IT"); //OK
Employee e2("Jane"); //OK
Employee e3(); //ERROR - function prototype
person LeopardSkinPillBoxHat    schedule 22.02.2010
comment
Инициализатор () в C++ не обязательно является вызовом конструктора по умолчанию. () инициализатор выполняет инициализацию значения, которая не эквивалентна вызову конструктора по умолчанию, т.е. последняя форма (без ()) не эквивалентна намерению, выраженному в первой. Правильный способ решения проблемы с прототипом — использовать синтаксис инициализации копирования MyClass object = MyClass() и надеяться, что компилятор преобразует его в эффективный код. - person AnT; 22.02.2010

Например:

class MyClass
{
   public:
   MyClass()
   {x = 0;}
   MyClass(int X)
   {x = X;}
   private:
   int x;
};

int main()
{
   MyClass myObject(56); // initialize x to value '56'
   MyClass myObject2; //calls default constructor and initializes x to 0
   return 0;
}
person cpx    schedule 22.02.2010