Здравствуйте, N. I., Вы писали:
NI>С чего бы это? Собственно, использование class не всем нравится, потому что в данном контексте оно обозначает произвольный тип, который может не иметь никакого отношения к классам. NI>В качестве такой альтернативы давным-давно есть ключевое слово typename.
Кстати да
NI>Оно хуже тем, что длиннее на один символ Те, кому длина не важна, могут использовать typename. Так зачем нужен ещё и struct?
Итого — никакой рациональности в паре "class можно, а struct нельзя" — нет. Видимо просто особенности исторического развития стандарта.
Здравствуйте, RussianFellow, Вы писали:
RF>Что такое POD-type?
Плоские старые данные...
Что-то вроде сплющенных старых пивных банок
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Теоретически можно — стандарт разрешает. Практически при использовании разных ключевых слов для одного класса можно поиметь проблемы с линковкой функций в VC++ из-за того, что он по-разному декорирует имена классов, в зависимости от использования class/struct.
Pzz>>А что, в C++ так можно?
NI>Теоретически можно — стандарт разрешает.
мне кажется, что стандарт против такого бардака
7.1.7.3 Elaborated type specifiers [dcl.type.elab]
....
3 The class-key or enum keyword present in the elaborated-type-specifier shall agree in kind with the declaration
to which the name in the elaborated-type-specifier refers. This rule also applies to the form of elaborated-typespecifier
that declares a class-name or friend class since it can be construed as referring to the definition of the
class. Thus, in any elaborated-type-specifier, the enum keyword shall be used to refer to an enumeration (7.2),
the union class-key shall be used to refer to a union (Clause 9), and either the class or struct class-key
shall be used to refer to a class (Clause 9) declared using the class or struct class-key.
9 Classes [class]
1 A class is a type. Its name becomes a class-name (9.1) within its scope.
class-name:
identifier
simple-template-id
Class-specifiers and elaborated-type-specifiers (7.1.7.3) are used to make class-names. An object of a class consists of a (possibly empty) sequence of members and base class objects.
class-specifier:
class-head { member-specificationopt }
class-head:
class-key attribute-specifier-seqopt class-head-name class-virt-specifieropt base-clauseopt
class-key attribute-specifier-seqopt base-clauseopt
class-head-name:
nested-name-specifieropt class-name
class-virt-specifier:
final
class-key:
class
struct
union
то есть маркеры класса class/struct/union не взаимозаменяемы в контексте объявления класса
Здравствуйте, RussianFellow, Вы писали:
RF>А чём отличие структуры от класса в нынешнем стандарте C++? Ведь в структурах, помимо данных, существуют также функции (методы), конструкторы и, как я понимаю, деструкторы.
Помимо видимости членов по умолчанию, поля структуры могут быть инициализированны в момент об'явления (инстанса).
Например:
Здравствуйте, alzt, Вы писали:
AWW>>Завали интервьюера на собеседовании. )) A>А чем слово typename отличается от слова class в С++?
Через typename класс не объявишь.
Раньше в шаблонных шаблонных параметрах (template template parameter) можно было использовать только class, начиная с C++17 теперь можно и typename.
Здравствуйте, Икс, Вы писали: Икс>Помимо видимости членов по умолчанию, поля структуры могут быть инициализированны в момент об'явления (инстанса). Икс>Например:
Икс>struct Foo { int poo; } boo = { 1 };
class Bar { public: int poo; } bar = { 3 };
// http://ideone.com/NPMZHC
#include <iostream>
int main()
{
struct Foo { int poo; } foo = { 2 };
class Bar { public: int poo; } bar = { 3 };
std::cout << foo.poo << std::endl;
std::cout << bar.poo << std::endl;
return 0;
}
uzhas:
U>мне кажется, что стандарт против такого бардака U>
U>7.1.7.3 Elaborated type specifiers [dcl.type.elab]
U>....
U>3 The class-key or enum keyword present in the elaborated-type-specifier shall agree in kind with the declaration
Kind в случае с class и struct один и тот же — это non-union class.
U>the union class-key shall be used to refer to a union (Clause 9), and either the class or struct class-key U>shall be used to refer to a class (Clause 9) declared using the class or struct class-key.
Заметь, что union обособляется от class и struct, а class и struct друг от друга — нет (тут не сказано "declared using the class or struct class-key respectively").
Здравствуйте, N. I., Вы писали:
U>>мне кажется, что стандарт против такого бардака U>>
U>>7.1.7.3 Elaborated type specifiers [dcl.type.elab]
U>>....
U>>3 The class-key or enum keyword present in the elaborated-type-specifier shall agree in kind with the declaration
NI>Kind в случае с class и struct один и тот же — это non-union class.
U>>the union class-key shall be used to refer to a union (Clause 9), and either the class or struct class-key U>>shall be used to refer to a class (Clause 9) declared using the class or struct class-key.
NI>Заметь, что union обособляется от class и struct, а class и struct друг от друга — нет (тут не сказано "declared using the class or struct class-key respectively").
night beast:
NB>а почему студия на такое ругается варнингами?
Видимо, из-за того, что её компилятор не умеет правильно декорировать имена классов (как было сказано выше). Jonathan Wakely из комитета по стандартизации C++ того же мнения:
This is a really stupid warning that only exists because the MS compiler has (or had) a bug that treats 'struct' and 'class' differently. GCC (and Clang) correctly implement the C++ standard which says it doesn't matter.
Здравствуйте, _niko_, Вы писали: __>Здравствуйте, Икс, Вы писали: Икс>>Помимо видимости членов по умолчанию, поля структуры могут быть инициализированны в момент об'явления (инстанса). Икс>>Например: __>
Икс>>struct Foo { int poo; } boo = { 1 };
__>
__>
class Bar { public: int poo; } bar = { 3 };
__>
__>// http://ideone.com/NPMZHC
__>#include <iostream>
__>int main()
__>{
__> struct Foo { int poo; } foo = { 2 };
__> class Bar { public: int poo; } bar = { 3 };
__> std::cout << foo.poo << std::endl;
__> std::cout << bar.poo << std::endl;
__> return 0;
__>}
__>
Эх, точно, посыпал голову пеплом, я пробовал без "public:" — не скомпилировалось
Здравствуйте, RussianFellow, Вы писали:
RF>В ранних стандартах C++ структура определялась как набор данных, а класс--как набор данных, функций (методов), констукторов, деструкторов...
В каких это "ранних"? Смотрим стандарт 1998 года:
9/4 A structure is a class defined with the classkey struct; its members and base classes (clause 10) are public by default (clause 11)...
Ты начал бы уже что-то читать самостоятельно. Форум может помочь разобраться в чем-то, что непонятно, но он не может заменить образования и самообразования.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, RussianFellow, Вы писали:
RF>Здравствуйте, Chorkov, Вы писали:
AG>>>Это правда когда-то так было? AG>>>(Я просто "в теме" с 2007ого)
C>>Нет, не было. Ни в стандарте С++03, ни в хелпах к компиляторам (по крайней мере Borland и MS VC). C>>Возможно, TC, какой-то совсем дурной учебник читал. C>>Возможно, он путает struct, с POD-type, потому что в качестве примера для них, все время приводят структуры...
RF>Что такое POD-type?
RF>(Учебники по C++ я покупал в 90-ые года и в начале 2000-ых годов).