Точка и запетая след скоби за декларация на клас

В C++ класове, защо точка и запетая след затварящата скоба? Редовно го забравям и получавам грешки на компилатора, а оттам и загубено време. Струва ми се някак излишно, което едва ли ще е така. Хората наистина ли правят неща като:

class MyClass
{
.
.
.
} MyInstance;

Получавам го от гледна точка на съвместимост със C за структури и enums, но тъй като класовете не са част от езика C, предполагам, че основно е там поддържането на последователност между подобни декларационни конструкции.

Това, което търсех, беше по-скоро свързано с обосновката на дизайна, отколкото с възможността да променя нещо, въпреки че една добра IDE за завършване на код може да улови това преди компилацията.


person SmacL    schedule 24.04.2009    source източник
comment
Това може да помогне: cpptalk.net/   -  person Michael Haren    schedule 24.04.2009
comment
@Michael, благодаря за линка. От историческа гледна точка има добър смисъл и ако C++ позволява всички C grammer и C++ класовете са синоними на структури, ние оставаме с необходимата точка и запетая в края на класа.   -  person SmacL    schedule 24.04.2009
comment
@Браян, да, сериозен въпрос. Наясно съм, че трябва да живея с това, но съм любопитен относно обосновката зад дизайна и изпълнението.   -  person SmacL    schedule 24.04.2009
comment
Добре, но може би трябва да редактирате въпроса си, за да включите желаната обосновка на дизайна. Както е, това насърчава хората да задават въпроси като защо къдравата скоба? :) Може да ви е интересно да прочетете Design & Evolution of C++ на Stroustrup, въпреки че обхваща по-тежки въпроси от точката и запетаята в края на часовете.   -  person Brian Neal    schedule 24.04.2009
comment
@Brian, достатъчно честно, и беше гранично дали да го уики или не. Въпросът беше зададен, след като се изпусна точка и запетая в редовно използвана заглавка в голяма компилация. Коства ми половин час, оттам и посещението на SO. Въпросът е редактиран според вашето предложение.   -  person SmacL    schedule 24.04.2009
comment
Класовете по същество са структури, единствената разлика е тяхното ниво на достъп по подразбиране (частен срещу публичен). Така че няма разлика по отношение на точка и запетая. Предполагам, че затова бях толкова недоверчив. :)   -  person Brian Neal    schedule 24.04.2009
comment
Препоръчвам да напишете всеки клас, като първо напишете скелета: class ClassName {\n private:\n public:\n }; и след това попълване на подробностите. Или, както казахте, използване на IDE, която ще направи това вместо вас   -  person MatrixFrog    schedule 25.04.2009
comment
@BrianNeal, този въпрос е доста стар на този етап, но бих казал, че класовете имат фундаментална разлика от структурите, тъй като те също могат да съдържат функции. Искам да кажа, да, те наистина са подобни на структурите, но нивото на достъп по подразбиране не е единствената разлика и възможността за капсулиране на функциите ги прави доста различни. Всичко това е само за да кажа, че смятам, че отбелязването на някаква разлика между тях е оправдано.   -  person Ryan Blanchard    schedule 26.02.2021
comment
Структурите @RyanBlanchard могат да имат функции-членове в C++.   -  person Brian Neal    schedule 26.02.2021


Отговори (7)


Точката и запетая след затварящата скоба в декларация на тип се изисква от езика. Така е от най-ранните версии на C.

И да, хората наистина правят декларацията, която току-що поставихте там. Полезно е за създаване на типове с обхват вътре в методите.

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

В този случай мисля, че е ясно защо са необходими точки и запетая. Що се отнася до това защо е необходимо в по-общия случай на деклариране в заглавния файл, не съм сигурен. Моето предположение е, че е историческо и е направено, за да улесни писането на компилатора.

person JaredPar    schedule 24.04.2009
comment
Защо не мога просто да създам тип с обхват, без да посочвам MyInstance? Изглежда странно, когато комбинирате две действия: деклариране на нов тип и деклариране на нова променлива. - person Mykola Golubyev; 24.04.2009
comment
@Mykola можеш и двете. Вижте пробата, която добавих - person JaredPar; 24.04.2009

връзката, предоставена от @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 */
} 
person Nathan    schedule 22.05.2014
comment
Да, имплицитният тип връщане int би изтрил всичко тук. Хубаво бижу - person Gaspa79; 25.07.2019

Предполагам, че е така, защото класовете са декларации, дори когато се нуждаят от скоби за групиране. И да, има исторически аргумент, че тъй като в C можете да направите

struct
{
  float x;
  float y;
} point;

трябва в C++ да можете да правите подобно нещо, има смисъл декларацията class да се държи по същия начин.

person unwind    schedule 24.04.2009

Това е съкращение от

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

Точката и запетая след фигурните скоби на декларацията на класа всъщност е излишна, но C++ е дефиниран така. Точката и запетая след декларацията на променливата винаги е необходима и има смисъл.

person Stefan Steinegger    schedule 24.04.2009
comment
И така, C++ изисква ли точка и запетая след всяка декларация? - person Loai Nagati; 25.05.2009
comment
Имайте предвид, че по този начин не можете да създадете обект от анонимен клас, докато можете по друг начин. - person Kevin; 09.11.2014

Добра точка. Наистина ли имате нужда от всичките 250+ реда?
person Mykola Golubyev    schedule 24.04.2009

Необходимо е след struct от съображения за съвместимост и как бихте искали това:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency
person Zifre    schedule 24.04.2009
comment
Но какво да кажем за namespace myNamespace { ... } // inconsistent but valid? - person Chris K; 25.01.2019

В C/C++ ; е терминатор на изявление. Всички изрази завършват с ; за да се избегне двусмислие (и да се опрости анализирането). Граматиката е последователна в това отношение. Въпреки че декларацията на клас (или който и да е блок за този въпрос) е дълга няколко реда и е ограничена с {}, тя все още е просто изявление ({ } е част от изявлението), следователно трябва да бъде прекратено с ; (; не е разделител/разделител)

В твоя пример

class MyClass{...} MyInstance;

е пълното изявление. Човек може да дефинира множество екземпляри на декларирания клас в един израз

class MyClass{...} MyInstance1, MyInstance2;

Това е напълно съвместимо с декларирането на множество екземпляри на примитивен тип в един израз:

int a, b, c;

Причината, поради която човек не вижда често такава декларация на клас и екземпляр, е, че екземплярът може „само? бъде глобална променлива и не искате често глобални обекти, освен ако не са статични и/или обикновени стари структури от данни.

person Roger Nelson    schedule 25.04.2009
comment
Но дефиницията на функция също е израз, но без точка и запетая. - person JP Zhang; 02.03.2018