C++
Тип Ключевые слова
Поиск…
учебный класс
Вводит определение типа класса .
class foo { int x; public: int get_x(); void set_x(int new_x); };
Представляет специфицированный спецификатор типа, который указывает, что следующее имя - это имя типа класса. Если имя класса уже объявлено, оно может быть найдено, даже если оно скрыто под другим именем. Если имя класса еще не было объявлено, оно объявляется вперед.
class foo; // elaborated type specifier -> forward declaration class bar { public: bar(foo& f); }; void baz(); class baz; // another elaborated type specifer; another forward declaration // note: the class has the same name as the function void baz() class foo { bar b; friend class baz; // elaborated type specifier refers to the class, // not the function of the same name public: foo(); };
Представляет параметр типа в объявлении шаблона .
template <class T> const T& min(const T& x, const T& y) { return b < a ? b : a; }
В объявлении параметра шаблона шаблона
class
ключевого слова предшествует имени параметра. Поскольку аргумент для параметра шаблона шаблона может быть только шаблоном класса, использованиеclass
здесь избыточно. Однако это требует грамматика C ++.template <template <class T> class U> // ^^^^^ "class" used in this sense here; // U is a template template parameter void f() { U<int>::do_it(); U<double>::do_it(); }
Обратите внимание, что смысл 2 и смысл 3 могут быть объединены в одну и ту же декларацию. Например:
template <class T> class foo { }; foo<class bar> x; // <- bar does not have to have previously appeared.
В объявлении или определении перечисления объявляет перечисление как облачное перечисление .
enum class Format { TEXT, PDF, OTHER, }; Format f = F::TEXT;
структура
Взаимозаменяемый с class
, за исключением следующих отличий:
- Если тип класса определяется с помощью ключевого слова
struct
, тогда стандартная доступность баз и членов являетсяpublic
а неprivate
. -
struct
не может использоваться для объявления параметра шаблона шаблона или шаблона шаблона; толькоclass
может.
перечисление
Вводит определение типа перечисления .
enum Direction { UP, LEFT, DOWN, RIGHT }; Direction d = UP;
В C ++ 11 enum
может необязательно сопровождаться class
или struct
для определения области с перечислением . Кроме того, как скопированные, так и незанятые перечисления могут иметь свой базовый тип, явно указанный : T
после имени перечисления, где T
относится к целочисленному типу.
enum class Format : char {
TEXT,
PDF,
OTHER
};
Format f = Format::TEXT;
enum Language : int {
ENGLISH,
FRENCH,
OTHER
};
Перечислителям в нормальном enum
s также может предшествовать оператор области видимости, хотя они все еще считаются включенными в область, в которой было указано enum
.
Language l1, l2;
l1 = ENGLISH;
l2 = Language::OTHER;
Представляет специфицированный спецификатор типа, который указывает, что следующее имя - это имя ранее объявленного типа перечисления. (Спецификатор специфицированного типа нельзя использовать для форварда-объявления типа перечисления.) Перечисление можно назвать таким образом, даже если оно скрыто под другим именем.
enum Foo { FOO }; void Foo() {} Foo foo = FOO; // ill-formed; Foo refers to the function enum Foo foo = FOO; // ok; Foo refers to the enum type
Вводит непрозрачную декламацию enum, которая объявляет перечисление без его определения. Он может либо обновить ранее объявленное перечисление, либо переслать-объявить перечисление, которое ранее не было объявлено.
Перечисление, объявленное сначала как область действия, впоследствии не может быть объявлено как незарегистрированное, или наоборот. Все объявления перечисления должны согласовываться в базовом типе.
Когда forward-декларирование неперечисленного перечисления, базовый тип должен быть явно указан, поскольку он не может быть выведен до тех пор, пока не будут известны значения перечислений.
enum class Format; // underlying type is implicitly int void f(Format f); enum class Format { TEXT, PDF, OTHER, }; enum Direction; // ill-formed; must specify underlying type
союз
Вводит определение типа объединения .
// Example is from POSIX union sigval { int sival_int; void *sival_ptr; };
Представляет специфицированный спецификатор типа, который указывает, что следующее имя - это имя типа объединения. Если имя союза уже объявлено, оно может быть найдено, даже если оно скрыто под другим именем. Если имя профсоюза еще не объявлено, оно объявляется вперед.
union foo; // elaborated type specifier -> forward declaration class bar { public: bar(foo& f); }; void baz(); union baz; // another elaborated type specifer; another forward declaration // note: the class has the same name as the function void baz() union foo { long l; union baz* b; // elaborated type specifier refers to the class, // not the function of the same name };