Почему в классах C ++ стоит точка с запятой после закрывающей фигурной скобки? Я регулярно забываю об этом и получаю ошибки компилятора, а значит, теряю время. Мне это кажется несколько лишним, что вряд ли так. Действительно ли люди делают такие вещи, как:
class MyClass
{
.
.
.
} MyInstance;
Я понимаю это с точки зрения совместимости с C для структур и перечислений, но поскольку классы не являются частью языка C, я предполагаю, что в первую очередь существует согласованность между аналогичными конструкциями объявления.
То, что я искал, было больше связано с обоснованием дизайна, а не с возможностью что-либо изменить, хотя хорошая среда IDE с завершением кода может уловить это перед компиляцией.
c++
class
oop
declaration
SmacL
источник
источник
Ответы:
Точка с запятой после закрывающей фигурной скобки в объявлении типа требуется языком. Так было с самых ранних версий C.
И да, люди действительно делают заявление, которое вы там только что разместили. Это полезно для создания типов с областью видимости внутри методов.
void Example() { struct { int x; } s1; s1.x = 42; struct ADifferentType { int x; }; }
В этом случае, думаю, понятно, зачем нужны точки с запятой. Я не уверен, зачем это нужно в более общем случае объявления в файле заголовка. Я предполагаю , что это исторически и было сделано, чтобы упростить написание компилятора.
источник
Ссылка предоставлена @MichaelHaren , как представляется , обеспечивают основную причину . Точка с запятой (как указывали другие) унаследована от C. Но это не объясняет, почему C использовал ее в первую очередь. Обсуждение включает эту жемчужину примера:
struct fred { int x; long y; }; main() { return 0; }
Более старые версии C имели неявный тип возвращаемого значения int из функции, если не указано иное. Если мы опустим символ
;
в конце определения структуры, мы не только определяем новый типfred
, но и объявляем, чтоmain()
он вернет экземплярfred
. Т.е. код будет разбираться так:struct fred { int x; long y; } main() { return 0; /* invalid return type, expected fred type */ }
источник
Я думаю, это потому, что классы являются объявлениями, даже когда им нужны фигурные скобки для группировки. И да, есть исторический аргумент, что, поскольку в C вы могли сделать
struct { float x; float y; } point;
в C ++ вы должны иметь возможность делать то же самое, для
class
объявления имеет смысл вести себя таким же образом.источник
Это сокращение от
class MyClass { . . . }; // instance declaration MyClass MyInstance; // semicolon here
Точка с запятой после фигурных скобок в объявлении класса на самом деле лишняя, но именно так определяется C ++. Точка с запятой после объявления переменной всегда нужна и имеет смысл.
источник
Я не использую такие объявления
class MyClass { . . . } MyInstance;
Но в этом случае я могу понять, почему там точка с запятой.
Потому что это как
int a;
- объявление переменной.Вероятно, для согласованности, поскольку вы можете опустить точку с запятой MyInstance.
источник
Он нужен после a
struct
по соображениям совместимости, и как бы вы этого хотели:struct MyStruct { ... }; class MyClass { ... } //inconsistency
источник
namespace myNamespace { ... } // inconsistent but valid
?В C / C ++ оператор; является терминатором утверждения. Все утверждения заканчиваются; чтобы избежать двусмысленности (и упростить синтаксический анализ). В этом отношении грамматика последовательна. Даже несмотря на то, что объявление класса (или любой блок в этом отношении) состоит из нескольких строк и разделен символом {}, он все еще является просто оператором ({} является частью оператора), следовательно, его необходимо завершить; (; Не является разделителем / разделителем)
В вашем примере
class MyClass{...} MyInstance;
это полное заявление. Можно определить несколько экземпляров объявленного класса в одном операторе
class MyClass{...} MyInstance1, MyInstance2;
Это полностью соответствует объявлению нескольких экземпляров примитивного типа в одном операторе:
int a, b, c;
Причина, по которой нечасто можно увидеть такое описание класса и экземпляра, заключается в том, что экземпляр мог? Only? быть глобальной переменной, и вам не очень часто нужны глобальные объекты, если они не являются статическими и / или простыми структурами старых данных.
источник