В объявлении класса С++:
class Thing
{
...
};
Почему я должен включать точку с запятой?
В объявлении класса С++:
class Thing
{
...
};
Почему я должен включать точку с запятой?
Полный синтаксис, по существу,
класс NAME {componentsents} экземпляры;
где "составляющие" - это последовательность элементов и методов класса, а "экземпляры" - это список экземпляров класса (например, объектов), разделенных запятыми.
Пример:
class FOO {
int bar;
int baz;
} waldo;
объявляет как класс FOO, так и объект waldo.
Последовательность экземпляров может быть пустой, и в этом случае у вас будет только
class FOO {
int bar;
int baz;
};
Вы должны поставить точку с запятой, чтобы компилятор знал, были ли вы объявлены какие-либо экземпляры или нет.
Это совместимая вещь C.
потому что вы можете опционально объявлять объекты
class Thing
{
...
}instanceOfThing;
по историческим причинам
Потому что это может быть определение следующего элемента. Например, взяв его из синтаксиса Си: если вы объявляете
struct {
...
}
main (int argc, char..
то он предполагает, что main возвращает struct. Если была точка с запятой,
struct {
...
};
main (int argc, char..
то main
возвращает int.
int a,b,c,d;
int main(void) {
struct y {
}; a, b, c, d;
struct x {
} a, b, c, d;
}
Два разных утверждения, два совершенно разных значения, оба юридические C/C++, и единственное отличие - это ;
после объявления структуры.
Утверждение a, b, c, d;
сам по себе, в этом контексте, просто оценивает a
, b
, c
и d
. В этом контексте это ничего не делает.
Однако, если он сразу после определения структуры/класса (перед ;
) создает 4 экземпляра созданной структуры/класса, a
, b
, c
и d
Потому что языковая грамматика говорит так...
Хорошее правило, которое поможет вам запомнить, где положить точки с запятой:
Пространства имен также не требуют конечной точки с запятой, так как они могут содержать сочетание обоих указанных выше (поэтому могут содержать код, поэтому не нужно использовать точку с запятой).