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.
    

Version >= C++ 11

  1. 在枚举的声明或定义中,将枚举声明为作用域枚举

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