サーチ…


クラス

  1. クラス型の定義を紹介します。

    class foo {
        int x;
      public:
        int get_x();
        void set_x(int new_x);
    };
    
  2. 次の名前がクラス型の名前であることを指定する精巧な型指定子を導入しました。クラス名がすでに宣言されている場合は、別の名前で隠されていても見つけられます。クラス名がすでに宣言されていない場合は、前方宣言されます。

    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();
    };
    
  3. テンプレートの宣言に型パラメータを導入します。

    template <class T>
    const T& min(const T& x, const T& y) {
        return b < a ? b : a;
    }
    
  4. テンプレートテンプレートパラメータの宣言では、キーワード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();
    }
    
  5. センス2とセンス3を同じ宣言で組み合わせることができます。例えば:

    template <class T>
    class foo {
    };
    
    foo<class bar> x; // <- bar does not have to have previously appeared.
    
C ++ 11
  1. enumの宣言または定義では、enumをスコープ付きenumとして宣言します。

    enum class Format {
        TEXT,
        PDF,
        OTHER,
    };
    Format f = F::TEXT;
    

構造体

次の違いを除いて、 classと互換性があります:

  • キーワードstructを使用してクラス・タイプが定義されている場合、ベースおよびメンバーのデフォルトのアクセシビリティは、 privateはなくpublicです。
  • structは、テンプレート型パラメータまたはテンプレートテンプレートパラメータを宣言するために使用することはできません。 classだけができます。

列挙型

  1. 列挙型の定義を紹介します。

    enum Direction {
        UP,
        LEFT,
        DOWN,
        RIGHT
    };
    Direction d = UP;
    
C ++ 11

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;
  1. 次の名前が以前に宣言された列挙型の名前であることを指定する精巧な型指定子を導入しました。 (正式な型指定子は、列挙型を前方宣言するためには使用できません。)列挙型は、別の名前で隠されていてもこの方法で名前を付けることができます。

    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
    
C ++ 11
  1. 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
    

連合

  1. ユニオンタイプの定義を紹介します。

    // Example is from POSIX
    union sigval {
        int     sival_int;
        void   *sival_ptr;
    };
    
  2. 次の名前が共用体型の名前であることを指定する精巧な型指定子を導入しました。共用体名が既に宣言されている場合は、別の名前で隠されていてもそれを見つけることができます。共用体名がすでに宣言されていない場合は、前方宣言されます。

    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
    };
    


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow