Является синтаксической ошибкой в С++ для завершения функции внутри определения класса с помощью;};
Этот код был предоставлен мне моим учителем в качестве примера функций в классе С++. Мне это кажется странным. Я всегда использовал для завершения функции с }
. Я думаю, что только определение класса заканчивается на };
. Здесь определения функций заканчиваются на };
. Как функция в классе, помимо публичного или частного, отличается от автономной функции? Это просто причуда или особенность С++?
class GenericItem {
public:
void SetName(string newName) {
itemName = newName;
};
void SetQuantity(int newQty) {
itemQuantity = newQty;
};
void PrintItem() {
cout << itemName << " " << itemQuantity << endl;
};
private:
string itemName;
int itemQuantity;
};
Ответы
Ответ 1
Это законно и всегда было законным (начиная с С++ 98), но синтаксический смысл этого ;
изменился с С++ 11 на С++ 14.
В С++ 11 (и раньше) допускается ;
, и это необязательная часть определения функции-члена.
член-декларация:
decl-specifier-seq opt member-declarator-list opt;
определение функции; opt
:: opt шаблон вложенного имени-спецификатора opt unqualified-id;
используя декларирование
шаблон декларация
Это не пустое объявление. (С++ 11 не поддерживает пустые объявления в области класса. Пустые объявления разрешены только в области пространства имен.) Таким образом, в случае С++ 11 (и до), что дополнительный ;
- это просто причуда грамматики языка, Почему это всегда было разрешено, мне не совсем понятно.
В С++ 14 (за n4296) этот ;
больше не является частью определения функции-члена. Это автономное пустое объявление, которое является законным в области класса с С++ 14.
член-декларация:
атрибут-specifier-seq opt decl-specifier-seq opt member-declarator-list opt;
функция четкости
используя декларирование
static_assert декларация
шаблон декларирование
псевдоним декларации
пустая декларация
В основном это означает, что следующее определение недопустимо в С++ 11 (и раньше), но оно действительно в С++ 14
class C
{
void foo() {};;
};
(Любопытно, что GCC отвергает его в режиме С++ 14.)
Ответ 2
Это полностью действует. Дополнительная точка с запятой ограничивает "пустое" объявление.
Это не "quirk", так как он действителен после функций, не являющихся членами.
Странно использовать ;
, когда вам этого не нужно, поэтому я не знаю, почему ваш учитель показал это вам таким образом. Это зависит от вас, но я бы вообще не рекомендовал использовать дополнительный ;
(и ваш компилятор, как видно из предупреждений, которые он испускает для вышеуказанного кода, согласен со мной).
Конечно, вы просто попробовали бы его выяснить.
Ответ 3
';' можно рассматривать как пустое предложение, которое ничего не делает. Чтобы сделать код чистым, это не очень хороший способ с таким количеством пустых предложений, которые ничего не делают в классе.