第18章 特殊工具与技术(12)

来源:岁月联盟 编辑:exp 时间:2012-01-12

18.6 局部类

可以在函数体内部定义类,这样的类称为局部类(local class)。一个局部类定义了一个类型,该类型只在定义它的局部作用域中可见。与嵌套类不同,局部类的成员是严格受限的。

局部类的所有成员(包括函数)必须完全定义在类定义体内部。因此,局部类远不如嵌套类有用。

类似地,不允许局部类声明static数据成员,没有办法定义它们。

1. 局部类不能使用函数作用域中的变量

局部类可以访问的外围作用域中的名字是有限的。局部类只能访问在外围作用域中定义的类型名、static变量和枚举成员,不能使用定义该类的函数中的变量。

[cpp] int a; 
class TheClass3{ 
public: 
    void foo(int c) 
    { 
        static int si; 
        enum Loc{e=1024,f}; 
        class Bar{ 
        public: 
            Loc locVal; 
            int barVal; 
            void fooBar(Loc i=e) 
            { 
                barVal=::a; 
                barVal=si; 
                barVal=f; 
            } 
        }; 
    } 
}; 
int a;
class TheClass3{
public:
 void foo(int c)
 {
  static int si;
  enum Loc{e=1024,f};
  class Bar{
  public:
   Loc locVal;
   int barVal;
   void fooBar(Loc i=e)
   {
    barVal=::a;
    barVal=si;
    barVal=f;
   }
  };
 }
};
2. 常规保护规则适用于局部类

外围函数对局部类的私有成员没有特殊访问权,当然,局部类可以将外围函数设为友元。

实际上,局部类中private成员几乎是不必要的,通常局部类的所有成员都为public成员。

3. 局部类中的名字查找

4. 嵌套的局部类

可以将一个类嵌套在局部类内部。这种情况下,嵌套类定义可以出现在局部类定义体之外,但是,嵌套类必须在定义局部类的同一作用域中定义。通常,嵌套类的名字必须用外围类的名字进行限定,并且嵌套类的声明必须出现在局部类的定义中。

[cpp] class TheClass3{ 
public: 
    void foo() 
    { 
        class Bar{ 
            class NestedBar; 
        }; 
 
        class Bar::NestedBar{ 
        }; 
    } 
}; 

 

摘自 xufei96的专栏