Различни начини за конструиране на обект в C++

Искам да конструирам обект в стека, използвайки 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();

е начинът, по който функция прототип е дефинирана в 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