Why must I put a semicolon at the end of class declaration in C++?

后端 未结 6 602
旧巷少年郎
旧巷少年郎 2020-12-01 09:22

In a C++ class declaration:

class Thing
{
    ...
};

why must I include the semicolon?

相关标签:
6条回答
  • 2020-12-01 09:26

    The full syntax is, essentially,

    class NAME { constituents } instances ;

    where "constituents" is the sequence of class elements and methods, and "instances" is a comma-separated list of instances of the class (i.e., objects).

    Example:

    class FOO {
      int bar;
      int baz;
    } waldo;
    

    declares both the class FOO and an object waldo.

    The instance sequence may be empty, in which case you would have just

    class FOO {
      int bar;
      int baz;
    };
    

    You have to put the semicolon there so the compiler will know whether you declared any instances or not.

    This is a C compatibility thing.

    0 讨论(0)
  • 2020-12-01 09:28

    This is why...

    int a,b,c,d;
    int main(void) {
        struct y {
      }; a, b, c, d;
        struct x {
      } a, b, c, d;
    }
    

    Two different statements, two completely different meanings, both legal C / C++, and the only difference is the ; after the struct declaration.

    The statement a, b, c, d; by itself, in this context, just evaluates a, b, c and d. In this context, that does nothing.

    However, if it's right after the struct/class definition (before the ;) it creates 4 instances of the created struct/class, a, b, c and d

    0 讨论(0)
  • 2020-12-01 09:33

    because you can optionally declare objects

    class Thing
    {
        ...
    }instanceOfThing;
    

    for historical reasons

    0 讨论(0)
  • 2020-12-01 09:33

    Because the language grammar says so...

    0 讨论(0)
  • 2020-12-01 09:35

    Because it could be a definition of the next element. For example, taking it from C syntax: if you declare

    struct { ... } main (int argc, char..

    then it assumes main returns a struct. If there was a semicolon,

    struct { ... }; main (int argc, char..

    then main returns an int.

    0 讨论(0)
  • 2020-12-01 09:44

    A good rule to help you remember where to put semicolons:

    • If it's a definition, it needs a semicolon at the end. Classes, structs and unions are all information for the compiler, so need a trailing ; to mark no declared instances.
    • If it contains code, it doesn't need a semicolon at the end. If statements, for loops, while loops and functions contain code, so don't need a trailing ;.

    Namespaces also don't require a trailing semicolon, because they can contain a mix of both the above (so can contain code, so don't need a semicolon).

    0 讨论(0)
提交回复
热议问题