サーチ…
クラス
クラス型の定義を紹介します。
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の宣言または定義では、enumをスコープ付きenumとして宣言します。
enum class Format { TEXT, PDF, OTHER, }; Format f = F::TEXT;
構造体
次の違いを除いて、 class
と互換性があります:
- キーワード
struct
を使用してクラス・タイプが定義されている場合、ベースおよびメンバーのデフォルトのアクセシビリティは、private
はなくpublic
です。 -
struct
は、テンプレート型パラメータまたはテンプレートテンプレートパラメータを宣言するために使用することはできません。class
だけができます。
列挙型
列挙型の定義を紹介します。
enum Direction { UP, LEFT, DOWN, RIGHT }; Direction d = UP;
C ++ 11では、 enum
スコープ付きenumを定義するために、 class
またはstruct
後にオプションでenum
ことができます。また、両方がスコープと対象範囲外の列挙は、その基礎となるタイプが明示で指定有することができる: T
列挙名、次のT
整数型を指します。
enum class Format : char {
TEXT,
PDF,
OTHER
};
Format f = Format::TEXT;
enum Language : int {
ENGLISH,
FRENCH,
OTHER
};
通常のenum
型のenum
は、 enum
が定義されているスコープ内にあると考えられますが、スコープ演算子の前に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を定義せずに宣言する、 不透明なenum宣言を導入しました。これは、以前に宣言されたenumを再宣言するか、または以前に宣言されていないenumを前方宣言することができます。
スコープとして宣言されたenumは、後でunscopedとして宣言することはできません。列挙型のすべての宣言は、基になる型で合意しなければなりません。
未スコープの列挙型を前方宣言する場合、列挙子の値がわかるまで推論することはできないため、基になる型は明示的に指定する必要があります。
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 };