4

I am quite new to C++ and have observed, that the following lines of code act differently

MyClass c1;
c1.do_work() //works
MyClass c2();
c2.do_work() //compiler error c2228: left side is not a class, structure, or union.
MyClass c3{};
c3.do_work() //works

with a header file as

class MyClass {
public:
    MyClass();
    void do_work();
};

Can you explain me, what the difference between the three ways of creating the object is? And why does the second way produce a compiler error?

T.C.
  • 133,968
  • 17
  • 288
  • 421
Ennosigaeon
  • 442
  • 7
  • 15

2 Answers2

7

The second version

MyClass c2();

is a function declaration - see the most vexing parse and gotw.

The first case is default initialisation.

The last case, new to C++11, will call the default constructor, if there is one, since even though it looks like an initialiser list {}, it's empty.

Community
  • 1
  • 1
doctorlove
  • 18,872
  • 2
  • 46
  • 62
6

Ways one and three call the default constructor.

MyClass c3{};

Is a new initialization syntax called uniform initialization. This is called default brace initialization. However:

MyClass c2();

Declares a function c2 which takes no parameters with the return type of MyClass.

yizzlez
  • 8,757
  • 4
  • 29
  • 44
  • For brace initialization some explanations and examples can be found here: http://msdn.microsoft.com/en-US/en-en/library/dn387583.aspx – Anonymous Jun 19 '14 at 13:39
  • For a more detailed explanation of why it is interpreted as a function, look at http://en.wikipedia.org/wiki/Most_vexing_parse. – Graznarak Jun 19 '14 at 16:57