views:

116

answers:

2

I want to construct an object in the stack, using C++. Do you know what is the difference between these to ways of calling the constructor (with and without parenthesis):

a) MyClass object ;

b) MyClass object() ;

I am using MFC and when constructing the global variable for the main app, if I use the latter way, I get an exception, I thought these two ways were equivalent.

Thank you guys for any information.

+8  A: 

This is one of those gotcha's of C++.

MyClass object();

is the way that a function prototype is defined in C++, so the compiler thinks you are trying to declare another function in the middle of another function.

If you want to invoke the default constructor (i.e. the one which takes no arguments), use this syntax instead:

MyClass object;

Also see this answer.

LeopardSkinPillBoxHat
The `()` initializer in C++ is not necessarily an invocation of default constructor. `()` initializer performs value-initialization which is not equivalent to default constructor invocation, i.e. the last form (without `()`) is not equivalent to the intent expressed in the first one. The proper way to work arount "prototype" problem is to use copy-initialization syntax `MyClass object = MyClass()` and hope that the compiler will translate it into efficient code.
AndreyT
@David: you're right and I'm deleting my comment
Eli Bendersky
+2  A: 

For example:

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